- - PR -
外部結合+結合から漏れた値の集計
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-08-29 16:11
ORACLE(8.1.7)の環境に以下のようなテーブルがあります。
【商品マスタ】 商品コード 商品名 --------------------------- 0 その他 1 菓子 2 食品 3 雑貨 【集計テーブル】 商品コード 件数 --------------------------- 0 5 1 10 3 17 6 2 上記のテーブルを以下の条件で集計します。 (1)【商品マスタ】に商品コードがあり、【集計テーブル】に商品コードがない場合 商品名を表示し、件数は0件と表示。 (2)【集計テーブル】に商品コードがあり、【商品マスタ】に商品コードがない場合 商品コード:0(その他)として集計する。 欲しい結果は以下の通りです。 【問合せ結果】 商品コード 商品名 件数 --------------------------------------- 0 その他 7 ←【集計テーブル】の商品コード0と6の件数の合計 1 菓子 10 2 食品 0 3 雑貨 17 下記の様なSQLを書いてみたのですが… UNIONや副問合せを使用しない、簡潔な書き方は無いでしょうか? SELECT 商品コード, MAX(商品名) AS 商品名, SUM(件数) AS 件数 FROM (SELECT A.商品コード, A.商品名, NVL(B.件数, 0) AS 件数 FROM 商品マスタ A, 集計テーブル B WHERE A.商品コード = B.商品コード(+) UNION ALL SELECT 0 AS 商品コード, NULL AS 商品名, SUM(件数) AS 件数 FROM 集計テーブル WHERE 商品コード NOT IN (SELECT 商品コード FROM 商品マスタ ) ) GROUP BY 商品コード よろしくお願い致します。 | ||||
|
投稿日時: 2007-08-31 11:16
「両方のテーブル全件を一度に集計」はできません。 (whereで結合しないでselect句で条件集計すれば出来なくは無いかも、ですが。) どんなにがんばってもa-zmaさんの書かれたような方法になると思います。 集計テーブルへ、件数0のレコード(例では商品コード2)を追加できれば もっと簡潔に書けるんですけどね。 | ||||
|
投稿日時: 2007-08-31 12:24
試してませんが、こんな感じ?
SELECT 商品マスタ.商品コード, 商品マスタ.商品名 ,SUM(商品.件数) AS 件数 FROM ( SELECT NVL(商品マスタ.商品コード, 0) AS 商品コード, 件数 FROM 集計テーブル LEFT JOIN 商品マスタ ON 集計テーブル.商品コード = 商品マスタ.商品コード ) AS 商品 INNER JOIN 商品マスタ ON 商品.商品コード = 商品マスタ.商品コード GROUP BY 商品マスタ.商品コード, 商品マスタ.商品名 複問合せ使ってますが、多少見た目はいいかと。 |
1