図でイメージするOracle DatabaseのSQL全集

第8回 PivotとUnPivot
OracleのSQLの各機能をイメージを交えて解説

Oracle ACE
山岸 賢治(やまぎし けんじ)ACE

SQLの初心者から上級者までを広く対象読者として、Oracle SQLの各機能の典型的な使用例を、学習効率が高いと思われる順序で、SQLのイメージ図を交えて解説します。
SQLをイメージつきで理解することで、素早くイメージからSQLを考えられるようになることを目標とします。

目次

第1部 PivotとUnPivotとは

第2部 Pivotの使用例

第3部 UnPivotの使用例

今回のテーマ

今回は、下記のOracleのSQL文の評価順序においての、1番目のfrom句で行列変換を行うことができる、PivotとUnPivotの使用例と私のSQLのイメージを解説します。

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句

動作確認環境

Oracle Database 11g Release 11.2.0.1.0 (Windows 32ビット版)

1 PivotとUnPivotとは

select文での行列変換

PivotとUnPivotはOracle11gR1の新機能で、select文での行列変換を容易に行うことができます。

英和辞典のPivotの意味の中で、select文でのPivotの意味に近いものを選ぶと、
動詞では、「旋回する,回転する」。名詞では、「旋回軸,回転軸」となります。

select文での評価順序において、PivotとUnPivotはfrom句の一部として評価されます。

▲ ページTOPに戻る

2 select文でのPivotとUnPivotの評価順序

from句の一部として評価されている例

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

-- from句の一部として評価されている例1
select * from (select 1 as ColA,5 as ColB from dual)
UnPivot(Vals1 for Cols1 in(ColA,ColA,ColA))
UnPivot(Vals2 for Cols2 in(ColB,ColB))
Pivot(count(*) for Vals1 in(1 as C1))
Pivot(count(*) for Vals2 in(5 as C2)) a 
Join dual b
  on a.C1 = 6;
出力結果
Cols1  Cols2  C1  C2  Dummy
-----  -----  --  --  -----
COLA   COLB    6   1  X
-- from句の一部として評価されている例2
with work(ColA,ColB) as(
select 1,1 from dual union all
select 2,2 from dual)
select *
  from work Join dual on 1=1
UnPivot(Vals for Cols in(ColA,ColB));
出力結果
Dummy  Cols  Vals
-----  ----  ----
X      COLA     1
X      COLB     1
X      COLA     2
X      COLB     2

▲ ページTOPに戻る

Left Curve
図でイメージする
Oracle DatabaseのSQL全集
Right Curve