はじめに
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 |
