Database JUNKY

MySQL,MariaDBを中心としたブログです

SQLで行と列を置き換える方法

行と列を置き換えるサンプルSQL

おみごと!です。(僕が作ったわけではない)ようは一時表を拡張ケース文を利用して実現したわけですね。月別、とか日別とかでこういうことが必要なケースって多々あると思います。僕は、プログラムでぐるぐる回していました。

情報取得元 http://db2forum.jp/viewtopic.php?p=598&sid=5532a0726b4f514eaef6deb3bcb32315

WITH 売上履歴縦持ち (年,商品コード,月,数量) AS (VALUES 
(2001,'A001', 1, 12), 
(2001,'A001', 2, 27), 
(2001,'A001', 3,101), 
(2001,'A001', 4,454), 
(2001,'A001', 5,590), 
(2001,'A001', 6, 32), 
(2001,'A001', 7, 61), 
(2001,'A001', 8, 34), 
(2001,'A001', 9, 13), 
(2001,'A001',10, 17), 
(2001,'A001',11, 21), 
(2001,'A001',12, 99), 
(2001,'A002', 1, 33), 
(2001,'A002', 2, 82), 
(2001,'A002', 3, 90), 
(2001,'A002', 4, 78), 
(2001,'A002', 5, 66), 
(2001,'A002', 6, 89), 
(2001,'A002', 7, 53), 
(2001,'A002', 8, 11), 
(2001,'A002', 9, 23), 
(2001,'A002',10, 16), 
(2001,'A002',11, 15), 
(2001,'A002',12, 78) 
), 
売上履歴横持ち (年,商品コード,1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月) AS ( 
SELECT 
年, 
商品コード, 
SUM(CASE WHEN 月 = 1 THEN 数量 ELSE 0 END), 
SUM(CASE WHEN 月 = 2 THEN 数量 ELSE 0 END), 
SUM(CASE WHEN 月 = 3 THEN 数量 ELSE 0 END), 
SUM(CASE WHEN 月 = 4 THEN 数量 ELSE 0 END), 
SUM(CASE WHEN 月 = 5 THEN 数量 ELSE 0 END), 
SUM(CASE WHEN 月 = 6 THEN 数量 ELSE 0 END), 
SUM(CASE WHEN 月 = 7 THEN 数量 ELSE 0 END), 
SUM(CASE WHEN 月 = 8 THEN 数量 ELSE 0 END), 
SUM(CASE WHEN 月 = 9 THEN 数量 ELSE 0 END), 
SUM(CASE WHEN 月 =10 THEN 数量 ELSE 0 END), 
SUM(CASE WHEN 月 =11 THEN 数量 ELSE 0 END), 
SUM(CASE WHEN 月 =12 THEN 数量 ELSE 0 END) 
FROM 売上履歴縦持ち 
GROUP BY 
年, 
商品コード 
) 
SELECT 
年, 
商品コード, 
1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月 
FROM 売上履歴横持ち;