• 締切済み

SQLについての質問

教えてください!! テーブルAに商品の売上情報(JANコード、売上金額、売上日)、テーブルBに商品マスタ情報(JANコード、更新日付、仕入区分、・・・)があります。欲しい情報は「仕入区分=1を満たす特定期間のJANコード別の売上金額合計」です。更新日付は他の商品マスタ情報を変更する都度付与される日付ですが、仕入区分はどの更新日付でも同じJANコードなら同じ値です。従って、単純に「仕入区分=1のJANコードの売上をSUM」で指定すると、重複行が発生し、正確な売上が出ません。例えば「同一JANコードなら最新の更新日付の仕入区分のみ見る」といった条件を加えるにはどのようにすればよいのでしょうか? 具体的なSQL文で教えてもらえると有り難いです。

みんなの回答

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3

別に「最新の更新日付の仕入区分のみ見る」でなくても,「仕入区分はどの更新日付でも同じJANコードなら同じ値」であるなら distinct で重複値をまとめればいいんじゃないでしょうか。 お使いのデータベース製品が distinct や サブクエリ に対応しているならこんなコードでしょうか。私も机上で書いてみただけで実行環境で試していませんが。 select A.JANコード, sum(売上金額) from A where 売上日 between 20080101 and 20081231  and A.JANコード in (     select distinct B.JANコード     from B     where 仕入区分 = 1    ) group by A.JANコード;

回答No.2

同じく今SQLの環境ないので試せませんが select A.JANコード,sum(A.売上金額) from 売上情報 A,(select JANコード JANコード、max(更新日付) 更新日付、max(仕入区分) 仕入区分 group by JANコード) B where A.JANコード=B.JANコード and B.仕入区分=1 and A.売上日>=20080101 and A.売上日<=20081231 group by A.JANコード こんな感じでどうでしょう。サブクエリを使うやり方です。そのサブクエリでgroup byで重複行を飛ばす。 しかし、商品マスタがこのテーブルはJANコードと更新日がキーになってるんですかね。普通こんなテーブル作りませんけど。

gonta1977
質問者

お礼

早速の回答ありがとうございました。 なるほどサブクエリでできるんですね。 勉強になりました。商品マスタは更新履歴を保存してるテーブルなんです。現在情報テーブルだと削除された商品もあるんですよ。

noname#147912
noname#147912
回答No.1

ちょっとSQL環境がないので、適当に書いてみたのですが、これじゃだめでしょうか SELECT A.JANコード,SUM(A.売上金額) FROM 売上情報商品 AS A,マスタ情報 AS B WHERE A.JANコード = B.JANコード AND B.更新日付 >= '20080101' GROUP BY A.売上金額

gonta1977
質問者

お礼

早速の回答ありがとうございました。 試してみましたがどうもうまくいきません・・・。

関連するQ&A

専門家に質問してみよう