ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

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

回答

 

回答者:jjon-com 別に「最新の更新日付の仕入区分のみ見る」でなくても,「仕入区分はどの更新日付でも同じ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コード;
種類:回答
どんな人:経験者
自信:参考意見
回答日時:08/04/15 23:11
回答番号:No.3
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:bonnumaman 同じく今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コードと更新日がキーになってるんですかね。普通こんなテーブル作りませんけど。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/15 12:11
回答番号:No.2
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼早速の回答ありがとうございました。
なるほどサブクエリでできるんですね。
勉強になりました。商品マスタは更新履歴を保存してるテーブルなんです。現在情報テーブルだと削除された商品もあるんですよ。

回答

 

回答者:bsml ちょっとSQL環境がないので、適当に書いてみたのですが、これじゃだめでしょうか

SELECT A.JANコード,SUM(A.売上金額)
FROM 売上情報商品 AS A,マスタ情報 AS B
WHERE A.JANコード = B.JANコード AND
B.更新日付 >= '20080101'
GROUP BY A.売上金額
種類:回答
どんな人:一般人
自信:参考意見
回答日時:08/04/15 10:44
回答番号:No.1
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼早速の回答ありがとうございました。
試してみましたがどうもうまくいきません・・・。
最新から表示回答順に表示