以下のテーブルがある。
JOBROUTE テーブル
| id | STATION | CAR | TRAIN | WALK |
| 1 | 新宿 | 5 | 12 | 120 |
| 2 | 渋谷 | 7 | 18 | 130 |
このCAR, TRAIN, WALK 列をUNPIVOTする。
SELECT id, STATION, M_TYPE, T_MINUTES FROM JOBROUTE UNPIVOT(T_MINUTES FOR M_TYPE IN(CAR , TRAIN , WALK))
結果
| id | STATION | M_TYPE | T_MINUTES |
| 1 | 新宿 | CAR | 5 |
| 1 | 新宿 | TRAIN | 12 |
| 1 | 新宿 | WALK | 120 |
| 2 | 渋谷 | CAR | 7 |
| 2 | 渋谷 | TRAIN | 18 |
| 2 | 渋谷 | WALK | 130 |
UNPIVOT で作成される列名を日本語にしたい。
CAR ⇒ 車
TRAIN ⇒ 電車
WALK ⇒ 徒歩
というように。。。
安全で確実な方法は、SELECT句でCASE文を書く方法
SELECT id ,STATION ,CASE M_TYPE WHEN 'CAR' THEN '車' WHEN 'TRAIN' THEN '電車' WHEN 'WALK' THEN '徒歩' END AS M_TYPE ,T_MINUTES FROM JOBROUTE UNPIVOT(T_MINUTES FOR M_TYPE IN(CAR , TRAIN , WALK))
SELECTでCASE式を避ける方法、一旦サブクエリになってしまうが、
WITH TJOBROUTE AS ( SELECT id ,STATION ,CAR AS "車" ,TRAIN AS "電車" ,WALK AS "徒歩" ,T_MINUTES FROM JOBROUTE ) SELECT id ,STATION ,M_TYPE ,T_MINUTES FROM TJOBROUTE UNPIVOT(T_MINUTES FOR M_TYPE IN("車", "電車", "徒歩"))
ここで、注意しなければならないのは、
Oracle は、AS 句で日本語など2バイト文字を使う場合は、シングルクォートではなく、
ダブルクォーテーションを使うことである。
| id | STATION | M_TYPE | T_MINUTES |
| 1 | 新宿 | 車 | 5 |
| 1 | 新宿 | 電車 | 12 |
| 1 | 新宿 | 徒歩 | 120 |
| 2 | 渋谷 | 車 | 7 |
| 2 | 渋谷 | 電車 | 18 |
| 2 | 渋谷 | 徒歩 | 130 |
Oracle UNPIVOT で注意すべき点
NULLの値の列は、デフォルトでは、行に変換されず無視される。
したがって、NULLでも行を作成したければ、INCLUDE NULLS を指定しなければならない。
WITH TJOBROUTE AS ( SELECT id ,STATION ,CAR AS "車" ,TRAIN AS "電車" ,WALK AS "徒歩" ,T_MINUTES FROM JOBROUTE ) SELECT id ,STATION ,M_TYPE ,T_MINUTES FROM TJOBROUTE UNPIVOT INCLUDE NULLS (T_MINUTES FOR M_TYPE IN("車", "電車", "徒歩"))
PostgreSQL は NULLでも処理してくれるのでこの include nulls の指定は必要がない。