
すみません、教えてください。
得意先の売上額上位10社のそれぞれについて、仕入合計額上位10商品のリストを出力するSQL
文をがわからなくて困っています。
できれば、一般的なSQL文(SQL92)でお願いします。
テーブルは、下記の2つです。
--------------------------------------------
・t_売上明細
売上日
得意先コード
商品コード
売上金額
・t_商品マスタ
商品コード
仕入単価
<出力>======================================
得意先コード, 売上合計,商品コード,仕入額合計
--------------------------------------------
C3 \300100
A08 \32500
A04 \31000
~~~
A10 \30000(Top10)
C2 \200200
A05 \22500
A04 \21000
~~~
A10 \20000(Top10)
~~~ ~~~
C10 \1000(Top10)
A97 \500
A14 \100
~~~
A96 \10(Top10)
================================
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
> ちなみに、SQL99ですと、もう少しスマートになるのでしょうか?
SQL99 だと WITH 句を使って整理すれば、少しはマシになるかも知れません。
SQL2003 のウィンドウ関数や Oracle の rownum を使えば、かなりスッキリしそうです。
http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3% …
http://docs.oracle.com/cd/E16338_01/server.112/b …
No.2
- 回答日時:
下記の前提で考えました。
・t_売上明細には売上個数のカラムも存在する
・どのテーブルのどの項目にも null は存在しない
・売上日に関する指定は無いので全期間の合計
SQL92しばりということなので、かなりややこしく、また、おそらく相当非効率になってしまいましたが、出来ることは出来ると思われます。
----------------------------------------
SELECT a.得意先コード, 売上合計, 商品コード, 仕入額合計 FROM
(
SELECT 得意先コード, SUM(売上金額) AS 売上合計
FROM t_売上明細 GROUP BY 得意先コード
ORDER BY SUM(売上金額) DESC LIMIT 10
) a
INNER JOIN
(
SELECT 得意先コード, 商品コード, SUM(売上個数 * 仕入単価) AS 仕入額合計
FROM t_売上明細 b INNER JOIN t_商品マスタ c USING(商品コード)
GROUP BY 得意先コード, 商品コード
HAVING
(
SELECT COUNT(*) FROM
(
SELECT 商品コード
FROM t_売上明細 d INNER JOIN t_商品マスタ USING(商品コード)
WHERE b.得意先コード = d.得意先コード
GROUP BY 商品コード
HAVING SUM(売上個数 * 仕入単価) > SUM(b.売上個数 * c.仕入単価)
) e
) < 10
) f
USING(得意先コード)
ORDER BY 売上合計 DESC, 得意先コード, 仕入額合計 DESC, 商品コード;
----------------------------------------
最初のサブクエリ(a)は売上合計の取得とその上位10社への絞込み、次のサブクエリ(f)は仕入額合計の取得とその得意先毎の上位10商品への絞込みを行なっています。
なお、売上合計が同じ得意先が有って10位が複数有る場合などは、その内どれか一つしか抽出されません。その場合、最初のサブクエリ(a)もHAVINGを使って絞り込む様にすれば、全て抽出されるようになります。
参考URL:http://codezine.jp/article/detail/460
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORA-01722: 数値が無効です
-
項目名の制限について
-
MySQLで改行を含む文の登録のし...
-
改行コードを削除して取得する...
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
Accessでテーブル名やクエリ名...
-
「直需」の意味を教えてください
-
Accessでテーブルの値をテキス...
-
エクセルグラフの凡例スペース
-
Accessでコードを入れると名前...
-
ORACLEでLONG項目からCHAR項目...
-
Oracle 2つのDate型の値の差を...
-
Access テキスト型に対する指定...
-
ワードで4段組みで文章を書い...
-
SUBSTRING 関数に渡した長さの...
-
Accessファイルを作成者以外は...
-
Accessクエリーで両方のテーブ...
-
主キーはオートナンバー型のID...
-
Accessで、固定アルファベット+...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォームで検索 エラーの表示...
-
MySQLで改行を含む文の登録のし...
-
SQLでグループ化した結果の件数...
-
ORA-01722: 数値が無効です
-
改行コードを削除して取得する...
-
項目名の制限について
-
オラクルSQLの累計値取得方法に...
-
アクセスのクエリについて(前...
-
以下のようなSQLについて教えて...
-
Accessで期間指定の売上合計と...
-
列名無効について
-
SQL文のエラーについて
-
縦表示データを列として取得す...
-
SQL文 2つのテーブルから、グ...
-
Excel 2019 のピボットテーブル...
-
「直需」の意味を教えてください
-
エクセルVBAで5行目からオート...
-
Accessでテーブル名やクエリ名...
-
エクセルグラフの凡例スペース
-
Oracle 2つのDate型の値の差を...
おすすめ情報