Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Oracle 11g R1新機能のPivotとUnPivot

select文で縦横変換

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/04/14 14:00

ダウンロード SourceCode (2.6 KB)

 Oracle 11g R1新機能のPivotとUnPivotについて、基本事項から使用例まで、SQLのイメージを交えて解説します。

目次

はじめに

 Oracle 11g R1新機能のPivotUnPivotについて、基本事項から使用例まで、SQLのイメージを交えて解説します。

対象読者

  • OracleのPivotUnPivotを使いたい方
  • OracleのSQLの理解を深めたい方

必要な環境

 本稿で扱うSQLは、Oracle 11.1.0.6.0で動作確認しました。SQL Server 2005以降でも応用が可能です。

1. PivotとUnPivotとは

 PivotUnPivotはOracle 11g R1の新機能で、select文での行列変換を容易に行うことができます。ちなみにPivotUnPivotは、SQL Server 2005以降でも使用できます。英和辞典によるとPivotの意味は、動詞では「旋回する」、名詞では「中心,軸,旋回軸,かなめ」です。

 下記のOracleのselect文の評価順序において、PivotUnPivotfrom句の一部として評価されるようです。

select文の評価順序
 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句

 PivotUnPivotfrom句の一部として評価されるので下記のようなselect文も実行できます。PivotUnPivotした結果に表別名を付けることもできます。

PivotとUnPivotはfrom句の一部として評価
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
PivotとUnPivotはfrom句の一部として評価
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

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5