質問 |
||
| QNo.3950154 | SQLについての質問 | |
|---|---|---|
| 質問者:gonta1977 | 教えてください!! テーブルAに商品の売上情報(JANコード、売上金額、売上日)、テーブルBに商品マスタ情報(JANコード、更新日付、仕入区分、・・・)があります。欲しい情報は「仕入区分=1を満たす特定期間のJANコード別の売上金額合計」です。更新日付は他の商品マスタ情報を変更する都度付与される日付ですが、仕入区分はどの更新日付でも同じJANコードなら同じ値です。従って、単純に「仕入区分=1のJANコードの売上をSUM」で指定すると、重複行が発生し、正確な売上が出ません。例えば「同一JANコードなら最新の更新日付の仕入区分のみ見る」といった条件を加えるにはどのようにすればよいのでしょうか? 具体的なSQL文で教えてもらえると有り難いです。 | |
困り度:
|
||
| 質問投稿日時: 08/04/15 08:48 |
||
回答 |
|
| ANo.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コード; |
|---|---|
| 回答者:jjon-com | |
| 種類:回答 どんな人:経験者 自信:参考意見 |
|
| 回答日時: 08/04/15 23:11 |
|
| |
| この回答への補足 | この回答に補足をつける(質問者のみ) |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.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コードと更新日がキーになってるんですかね。普通こんなテーブル作りませんけど。 |
|---|---|
| 回答者:bonnumaman | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/04/15 12:11 |
|
| |
| この回答への補足 | この回答に補足をつける(質問者のみ) |
| この回答へのお礼 | 早速の回答ありがとうございました。 なるほどサブクエリでできるんですね。 勉強になりました。商品マスタは更新履歴を保存してるテーブルなんです。現在情報テーブルだと削除された商品もあるんですよ。 |
回答 |
|
| ANo.1 | ちょっとSQL環境がないので、適当に書いてみたのですが、これじゃだめでしょうか SELECT A.JANコード,SUM(A.売上金額) FROM 売上情報商品 AS A,マスタ情報 AS B WHERE A.JANコード = B.JANコード AND B.更新日付 >= '20080101' GROUP BY A.売上金額 |
|---|---|
| 回答者:bsml | |
| 種類:回答 どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/04/15 10:44 |
|
| |
| この回答への補足 | この回答に補足をつける(質問者のみ) |
| この回答へのお礼 | 早速の回答ありがとうございました。 試してみましたがどうもうまくいきません・・・。 |