- PR -

外部結合+結合から漏れた値の集計

1
投稿者投稿内容
a-zma
会議室デビュー日: 2007/06/04
投稿数: 16
投稿日時: 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/06/26
投稿数: 157
投稿日時: 2007-08-31 11:16
引用:

UNIONや副問合せを使用しない、簡潔な書き方は無いでしょうか?



「両方のテーブル全件を一度に集計」はできません。
(whereで結合しないでselect句で条件集計すれば出来なくは無いかも、ですが。)
どんなにがんばってもa-zmaさんの書かれたような方法になると思います。

集計テーブルへ、件数0のレコード(例では商品コード2)を追加できれば
もっと簡潔に書けるんですけどね。
tkrn
ベテラン
会議室デビュー日: 2005/10/25
投稿数: 61
投稿日時: 2007-08-31 12:24
試してませんが、こんな感じ?

SELECT 商品マスタ.商品コード, 商品マスタ.商品名 ,SUM(商品.件数) AS 件数
FROM
(
SELECT NVL(商品マスタ.商品コード, 0) AS 商品コード, 件数
FROM 集計テーブル
LEFT JOIN 商品マスタ
ON 集計テーブル.商品コード = 商品マスタ.商品コード
) AS 商品
INNER JOIN 商品マスタ
ON 商品.商品コード = 商品マスタ.商品コード
GROUP BY 商品マスタ.商品コード, 商品マスタ.商品名

複問合せ使ってますが、多少見た目はいいかと。
1

スキルアップ/キャリアアップ(JOB@IT)