縦持ちのデータを横持ちへ変換する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 ;