こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQL MAX関数を検索条件にする。

SQL MAX関数を検索条件にする。

わかる方がいれば助けてください。
下記のようなデータのテーブルあります。

  ID        品番      金額          日付
OUTLET 210  00182-1080   5600         20090915
OUTLET 214 00182-1080   5600         20090916
OUTLET 217 00182-1080   5600         20090917
OUTLET 50 00182-1080   5600         20090609
OUTLET 437 00191-1082   3300         20100305
BLK09SS703 00191-1082   5500         20090703
OUTLET 141 00191-1082   5500         20090717
OUTLET 170 00191-1082   5500         20090806

このテーブルデータの各品番について最新日付のデータのみを出力したいのですが、
方法がわかりません。group byでHAVING検索なども試しましたがうまくいきませんでした。

<抽出したいデータ>
  ID        品番      金額          日付
OUTLET 217 00182-1080   5600         20090917
OUTLET 437 00191-1082   3300         20100305

どなたかお願いします。
前にも同じような質問をさせていただきましたが、
解決できずにこまっています。

投稿日時 - 2010-05-26 16:38:50

QNo.5923441

すぐに回答ほしいです

質問者が選んだベストアンサー

下記のSQL文を参照してください。

SELECT
TB1.ID ,
TB1.HINBAN , -- 品番(HINBAN) [ VARCHAR2(20) NULL ]
TB1.KINGAKU , -- 金額(KINGAKU) [ NUMBER(7,0) NULL ]
TB1.HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ]
FROM TEST_TABLE TB1
INNER JOIN( SELECT
HINBAN , -- 品番(HINBAN) [ VARCHAR2(20) NULL ]
MAX(HIZUKE) AS HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ]
FROM TEST_TABLE
GROUP BY HINBAN -- 品番(HINBAN) [ VARCHAR2(20) NULL ]
) TB2
ON TB1.HINBAN = TB2.HINBAN -- 品番(HINBAN) [ VARCHAR2(20) NULL ]
AND TB1.HIZUKE = TB2.HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ]

注:SQL文実行の結果は添付画像を参照してください。

投稿日時 - 2010-05-26 19:40:09

補足

ご回答ありがとうございます。
大変参考になりました。
この方法でできたと思ったんですが、新たに問題が出てきてしまいました。
TB1のレコードで稀に最新日付が同一のものがあり、その品番についてINNERJOINすると
あたりまえですがその品番だけ2行抽出されてしまいます。
このような品番が出た場合、金額が安いほうをとってきたいのですが、
なにか方法はありますでしょうか?
品番が重複するようなことはどうしても避けたいのです。

お手数ですがなにかよい方法があれば教えていただきたいです。

投稿日時 - 2010-05-27 11:29:26

お礼

すいません。
Group Byの存在を忘れてました。
無事解決しました。

ありがとうございます。 

投稿日時 - 2010-05-27 12:13:27

このQ&Aは役に立ちましたか?

22人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

相関サブクエリを使っても出来ますね。
テーブルの定義は1の方と同じとして、下記の様になります。

例) --------------------------------------------------
SELECT * FROM TEST_TABLE a
WHERE
NOT EXISTS (
SELECT 1 FROM TEST_TABLE b WHERE a.HINBAN = b.HINBAN AND a.HIZUKE < b.HIZUKE
)
------------------------------------------------------

「各品番について最新日付のデータ」は以下の様に読み替えられます。
「『同じ品番でより新しい日付の別のデータ』が無いデータ」
これをSQLで表現していることになります。

参考URL:http://codezine.jp/article/detail/1076?p=2

投稿日時 - 2010-05-27 01:23:55

お礼

ご回答ありがとうございます。
初めて知る関数です。
なんか便利そうですね。
後学のために頭の中にとどめておきます。

また大変申し訳ないんですが、新たな問題が出てきてしまいました。
補足欄に追記させていただきましたので、
お時間があれば助けていただきたいです。
よろしくお願いします。

投稿日時 - 2010-05-27 11:35:36

あなたにオススメの質問