
こんにちは
【テーブル概要】
テーブル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年くらい)、ありえない程深いネストになってしまいます。。
どなたかお知恵をお貸し願います。
No.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年に限定しているので、実際に欲しい形に変更する。
※年を意識しない作りにするなど。
回答の通りで出来ました!
なるほど、一度斜めに出してgroup byするのですか。。
勉強になりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
カウント結果を1レコードの中で横に並べたい
MySQL
-
SQLにて縦を横へ展開
Oracle
-
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
4
キーが同じを複数行を1行にまとめるには?
Oracle
-
5
単一グループのグループ関数ではありません。
Oracle
-
6
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
7
sqlplusで表示が変なので、出力を整形したい。
Oracle
-
8
MAX値を条件にデータを取得するには?
SQL Server
-
9
VB.NET2003 テキストボックスに半角英数字以外入力させない
Visual Basic(VBA)
-
10
テーブルからのselectにおいてデータの有無により結果をわけたい
PostgreSQL
-
11
ORACLE SQLビューで縦レコードを横1列に表示する方法
Oracle
-
12
FROM の中で CASE を使えるでしょうか
SQL Server
-
13
複数列の最大値を求めたい
SQL Server
-
14
SQL Server 縦データを横データに
SQL Server
-
15
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
16
select文の実行結果に空白行を入れたい
MySQL
-
17
SQL文で右から1文字だけ削除するやり方
MySQL
-
18
件数とデータを同時に取得するには?
Oracle
-
19
SELECT結果の縦と横の入れ替え
Oracle
-
20
SQL文のwhere条件文で使う <> の意味はなんですか
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
ワードの差込印刷で金額にコン...
-
5
bill と invoice の違い
-
6
「弁済金」とは「支払額」と同...
-
7
本人確認書類で本籍地を消して...
-
8
クレジットカードの明細に下記...
-
9
クレジットカードの請求
-
10
クレジットカード請求
-
11
クレジットカードこの後捨てる...
-
12
カード誤請求、見覚えのない請...
-
13
楽天カード 速報版カード利用の...
-
14
売り上げ請求してから売り上げ...
-
15
グ-アイデイケツサイリヨウリヨ...
-
16
ラブホテルでのクレジットカード
-
17
クレジットカードの電話対応の...
-
18
住友VISAプリペイドカードを使...
-
19
とあるサブスクリプションを購...
-
20
ヨドバシでキャンセルしました...
おすすめ情報
公式facebook
公式twitter