管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

縦横変換して集計するSQL

縦持ちのデータを横持ちへ変換するSQLについてメモ。たまにCASE文を使うと忘れてしまう。

やりたいこと

受注年 受注月 品名 受注数
2018 3 りんご 5
2018 3 みかん 1
2018 6 りんご 4
2018 6 みかん 2
2018 6 ぶどう 10
2018 9 りんご 1
2018 9 みかん 2
2018 9 ぶどう 2
2018 12 みかん 2
2018 12 ぶどう 2
2019 3 りんご 6
2019 3 みかん 3
2019 3 ぶどう 9
2019 6 りんご 1
2019 6 みかん 7
2019 9 みかん 2
2019 9 ぶどう 8
2019 12 りんご 5
2019 12 みかん 1
2019 12 ぶどう 9

こんなようなテーブルを

受注年 受注月 りんご みかん ぶどう
2018 3 5 1 -
2018 6 4 2 10
2018 9 1 2 2
2018 12 - 2 2
2019 3 6 3 9
2019 6 1 7 -
2019 9 - 2 8
2019 12 5 1 9

てな感じで、品目を横持ちにして集計したいということです。
※テーブルはあくまで例です。

SQL例

CASE文で分岐させてます。(Oracleで実行)

select
    order_year,
    order_month,
    sum("りんご"),
    sum("みかん"),
    sum("ぶどう")
from
    (select
        order_year,
        order_month,
        CASE 
            WHEN ITEM_NAME ='りんご' THEN order_volume
           ELSE NULL
        END "りんご",
        CASE 
            WHEN ITEM_NAME ='みかん' THEN order_volume
           ELSE NULL
        END "みかん",
        CASE 
            WHEN ITEM_NAME ='ぶどう' THEN order_volume
           ELSE NULL
        END "ぶどう"
    from
        order_table
    )
group by
    order_year,
    order_month
order by
    order_year,
    order_month
;