- ベストアンサー
SQLの抽出方法について
あるテーブルに以下のカラムがあります。 店舗コード,売上日,金種コード,履歴番号,売上金額 プライマリキー(店舗コード~履歴番号) このテーブルには、店舗、売上日、金種コードごとの売上金額が履歴で管理されています。 ・データイメージ 0001,2004/04/01,01,0,1000 ・・・1行目 0001,2004/04/01,01,1,1100 ・・・2行目 0002,2004/04/01,02,0,500 ・・・3行目 0003,2004/04/01,03,0,2000 ・・・4行目 0003,2004/04/01,03,1,2010 ・・・5行目 0003,2004/04/01,03,2,1500 ・・・6行目 0001,2004/04/02,01,0,800 ・・・7行目 ・ ・ このデータから、売上日を指定して、 全店舗の金種ごとの履歴番号が最大のレコード(2,3,6行) を取得したいのですが、いいSQLが思いつかないので、ご存知の方教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
わかりやすさを第一にすると、ビューを作るのが一番わかりやすいですね。 CREATE VIEW TABLE_MAX_RIREKI(店舗コード, 売上日, 金種コード, 最大履歴) AS SELECT 店舗コード, 売上日, 金種コード, MAX(履歴番号) FROM TABLE GROUP BY 店舗コード, 売上日, 金種コード こう定義しておくと、抽出クエリーは、次の通り。 SELECT A.店舗コード , A.売上日 , A.金種コード , A.履歴番号 , 売上金額 FROM TABLE A, TABLE_MAX_RIREKI B WHERE A.店舗コード = B.店舗コード AND A.売上日 = B.売上日 AND A.金種コード = B.金種コード AND A.履歴番号 = B.最大履歴 くらいの感じでしょうか。 ここからは、データベースの指定がないので、機種固有になります。 一つのクエリーの形でどうしても作りたいなら、ということで、考え方だけ。 もし、FROM句にSELECT文が書くことが許されてましたら、FROM TABLE A, TABLE_MAX_RIREKI B のTABLE_MAX_RIREKIの所に、ビューの定義のセレクト文を書けばいけるでしょう。 WHERE句のサブクエリーで、リスト形式の比較(複数フィールドの比較)が許されているなら、ビューの定義をサブクエリーの形に取り込んで、WHERE句で、(店舗コード , 売上日 , 金種コード , 履歴番号) と比較してください。 これもダメなら、WHERE句で、 店舗コード||売上日||金種コード||履歴コード と、ビューの定義のフィールドを同じ形に置き換えたものを返すサブクエリーとの比較でいけると思います。(要するに、文字列の形で連結して一つのフィールドとみなしているだけですね。)
その他の回答 (1)
- osamuy
- ベストアンサー率42% (1231/2878)
売上日,店舗コード,金種コード,履歴番号でレコードを特定できるなら、 select T.* from T,(select 売上日,店舗コード,金種コード,max(履歴番号) 履歴番号 from T where 売上日=? group by 売上日,店舗コード,金種コード) TMAX where T.売上日=TMAX.売上日 and T.店舗コード=TMAX.店舗コード and T.金種コード=TMAX.金種コード and T.履歴番号=TMAX.履歴番号; ――でどうでしょう。
お礼
ご回答ありがとうございます。 とても参考になりました。
お礼
ご回答ありがとうございます。 CREATE VIEWの部分をサブクエリにしてうまくいきました。