電子書籍の厳選無料作品が豊富!

あるテーブルに以下のカラムがあります。
店舗コード,売上日,金種コード,履歴番号,売上金額
プライマリキー(店舗コード~履歴番号)

このテーブルには、店舗、売上日、金種コードごとの売上金額が履歴で管理されています。

・データイメージ
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が思いつかないので、ご存知の方教えてください。

A 回答 (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句で、 店舗コード||売上日||金種コード||履歴コード と、ビューの定義のフィールドを同じ形に置き換えたものを返すサブクエリーとの比較でいけると思います。(要するに、文字列の形で連結して一つのフィールドとみなしているだけですね。)

 
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
CREATE VIEWの部分をサブクエリにしてうまくいきました。

お礼日時:2004/05/24 13:45

売上日,店舗コード,金種コード,履歴番号でレコードを特定できるなら、



select T.* from T,(select 売上日,店舗コード,金種コード,max(履歴番号) 履歴番号 from T where 売上日=? group by 売上日,店舗コード,金種コード) TMAX
where T.売上日=TMAX.売上日 and T.店舗コード=TMAX.店舗コード and T.金種コード=TMAX.金種コード and T.履歴番号=TMAX.履歴番号;

――でどうでしょう。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
とても参考になりました。

お礼日時:2004/05/24 13:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!