dポイントプレゼントキャンペーン実施中!

こんにちは


【テーブル概要】
テーブルA(会員番号テーブル)
・会員番号(PK)

テーブルB(買い物情報テーブル)
・会員番号(PK)
・買い物月(PK)
・商品番号(PK)
・請求金額


【したいこと】
上記のようなテーブルがあった場合に、以下のような出力を行いたいと思っています。

会員番号,商品番号,買い物月(7月)の請求金額,買い物月(8月)の請求金額,買い物月(9月)の請求金額
--------,--------,-----------------------,-----------------------,-----------------------
会員1  ,商品1  ,          500,            ,          100
会員1  ,商品2  ,            ,          300,          100
会員2  ,商品1  ,          1500,          100,          100
会員3  ,商品3  ,            ,            ,          100
会員3  ,商品4  ,            ,          200,           

【試したこと】
一度、テーブルBを買い物月単位に割ってみました。

テーブルB_買い物月(7月)
・会員番号(PK)
・商品番号(PK)
・請求金額

テーブルB_買い物月(8月)
・会員番号(PK)
・商品番号(PK)
・請求金額

テーブルB_買い物月(9月)
・会員番号(PK)
・商品番号(PK)
・請求金額

それからINNER JOINで繋いでいけば、できるかと思ったのですが
実際の買い物月は結構過去まであり(2003年くらい)、ありえない程深いネストになってしまいます。。


どなたかお知恵をお貸し願います。

A 回答 (1件)

縦横変換の典型ですね。


サンプルを提示しますので、加工してください。

SELECT
会員番号,
商品番号,
'2008年' AS 年度,
SUM(CASE WHEN 買い物月 = 200801 THEN NVL(請求金額,0) END) 請求金額01月,
SUM(CASE WHEN 買い物月 = 200802 THEN NVL(請求金額,0) END) 請求金額02月,
SUM(CASE WHEN 買い物月 = 200803 THEN NVL(請求金額,0) END) 請求金額03月,
SUM(CASE WHEN 買い物月 = 200804 THEN NVL(請求金額,0) END) 請求金額04月,
SUM(CASE WHEN 買い物月 = 200805 THEN NVL(請求金額,0) END) 請求金額05月,
SUM(CASE WHEN 買い物月 = 200806 THEN NVL(請求金額,0) END) 請求金額06月,
SUM(CASE WHEN 買い物月 = 200807 THEN NVL(請求金額,0) END) 請求金額07月,
SUM(CASE WHEN 買い物月 = 200808 THEN NVL(請求金額,0) END) 請求金額08月,
SUM(CASE WHEN 買い物月 = 200809 THEN NVL(請求金額,0) END) 請求金額09月,
SUM(CASE WHEN 買い物月 = 200810 THEN NVL(請求金額,0) END) 請求金額10月,
SUM(CASE WHEN 買い物月 = 200811 THEN NVL(請求金額,0) END) 請求金額11月,
SUM(CASE WHEN 買い物月 = 200812 THEN NVL(請求金額,0) END) 請求金額12月
FROM テーブルB
where 買い物月 between 200801 and 200812
GROUP BY
会員番号,
商品番号;

ポイント
・CASEで該当するデータを横展開する。
・Group Byで横展開した値を集計し1列に集約する。

応用
 ・各カラムのデータ型にあわせてSQLを変更する。
  ※date型、number型、char型。
 ・上記は2008年に限定しているので、実際に欲しい形に変更する。
  ※年を意識しない作りにするなど。
    • good
    • 1
この回答へのお礼

回答の通りで出来ました!
なるほど、一度斜めに出してgroup byするのですか。。
勉強になりました。
ありがとうございました。

お礼日時:2008/09/29 17:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す