はじめに
Oracle 11g R1新機能のPivot
とUnPivot
について、基本事項から使用例まで、SQLのイメージを交えて解説します。
対象読者
- Oracleの
Pivot
とUnPivot
を使いたい方 - OracleのSQLの理解を深めたい方
必要な環境
本稿で扱うSQLは、Oracle 11.1.0.6.0で動作確認しました。SQL Server 2005以降でも応用が可能です。
1. PivotとUnPivotとは
Pivot
とUnPivot
はOracle 11g R1の新機能で、select
文での行列変換を容易に行うことができます。ちなみにPivot
とUnPivot
は、SQL Server 2005以降でも使用できます。英和辞典によるとPivot
の意味は、動詞では「旋回する」、名詞では「中心,軸,旋回軸,かなめ」です。
下記のOracleのselect
文の評価順序において、Pivot
とUnPivot
はfrom
句の一部として評価されるようです。
1. from句 2. where句 (結合条件) 3. start with句 4. connect by句 5. where句 (行のフィルタ条件) 6. group by句 7. having句 8. model句 9. select句 10. union、minus、intersectなどの集合演算 11. order by句
Pivot
とUnPivot
はfrom
句の一部として評価されるので下記のようなselect
文も実行できます。Pivot
やUnPivot
した結果に表別名を付けることもできます。
select * from dual unpivot(vals1 for key1 in(dummy,dummy,dummy,dummy,dummy)) unpivot(vals2 for key2 in(key1,key1)) pivot(max(key2) for vals2 in('DUMMY' as newDummy)) pivot(max(newDummy) for vals1 in('DUMMY' as newDummy2)) a Join dual b on a.newDummy2 is null;
newDummy2 | DUMMY |
X | null |
select * from (select RowNum as r1,RowNum as r2 from dict where RowNum <= 2) a Join dual b on 1=1 UnPivot(Val for Keys in(r1,r2));
DUMMY | Keys | Val |
X | R1 | 1 |
X | R2 | 1 |
X | R1 | 2 |
X | R2 | 2 |