PIVOT または UNPIVOT を使わなくてはならない状況は、
データ設計に問題があると思う。
よってどうしても不慣れであった。
Oracle のPIVOTは、以下の書式で書くことになっていて
PIVOT(集約関数 FOR 集約条件列 IN(集約条件値1 as 集約後列名1,
集約条件値2 as 集約後列名2,
集約条件値3 as 集約後列名3))
しかも対象テーブル集約は、暗黙のGROUP BY であって、
PIVOT( MAX(列名) OVER( PARTITION BY ~) のように、任意 GROUP BY にしたくても、
OVER句の使用がここでは許されていない。
PIVOT による集約はかなり限定されてしまう。
以下、サンプル
WITH sales AS ( SELECT ' ' AS SCODE, ' ' AS ITEM, 0 AS SALE_NUM FROM dual WHERE 1=0 UNION ALL SELECT '01','みかん',10 FROM dual UNION ALL SELECT '01','バナナ',12 FROM dual UNION ALL SELECT '01','レモン',16 FROM dual UNION ALL SELECT '02','みかん',18 FROM dual UNION ALL SELECT '02','バナナ',25 FROM dual UNION ALL SELECT '02','レモン',11 FROM dual UNION ALL SELECT '03','みかん',5 FROM dual UNION ALL SELECT '03','バナナ',2 FROM dual UNION ALL SELECT '03','レモン',7 FROM dual UNION ALL SELECT '02','バナナ',10 FROM dual UNION ALL SELECT '02','レモン',23 FROM dual ) SELECT SCODE, ORANGE_NUM, BANANA_NUM, LEMON_NUM FROM sales PIVOT ( MAX(SALE_NUM) FOR ITEM IN ('みかん' AS ORANGE_NUM ,'バナナ' AS BANANA_NUM ,'レモン' AS LEMON_NUM ) )
結果は、
| SCODE | ORANGE_NUM | BANANA_NUM | LEMON_NUM |
| 03 | 5 | 2 | 7 |
| 01 | 10 | 12 | 16 |
| 02 | 18 | 25 | 23 |