• ベストアンサー
  • すぐに回答を!

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

  • 質問No.5923441
  • 閲覧数2725
  • ありがとう数24
  • 回答数2

お礼率 42% (85/200)

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

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

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

  • 回答No.1
  • ベストアンサー

ベストアンサー率 44% (4/9)

下記の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文実行の結果は添付画像を参照してください。
補足コメント
anman0201

お礼率 42% (85/200)

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

お手数ですがなにかよい方法があれば教えていただきたいです。
投稿日時:2010/05/27 11:29
お礼コメント
anman0201

お礼率 42% (85/200)

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

ありがとうございます。 
投稿日時:2010/05/27 12:13

その他の回答 (全1件)

  • 回答No.2

ベストアンサー率 60% (488/809)

相関サブクエリを使っても出来ますね。
テーブルの定義は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で表現していることになります。
お礼コメント
anman0201

お礼率 42% (85/200)

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

また大変申し訳ないんですが、新たな問題が出てきてしまいました。
補足欄に追記させていただきましたので、
お時間があれば助けていただきたいです。
よろしくお願いします。
投稿日時:2010/05/27 11:35
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ