新規列の列名の省略
下記のように、新規列の列名を省略することもできます。SQLを試行錯誤する段階などで使い道があるかもしれません。
select *
from Courses
pivot (max('○') for course in('SQL入門',
'UNIX基礎',
'Java中級'))
order by name;
| name | 'SQL入門' | 'UNIX基礎' | 'Java中級' |
| 吉田 | null | ○ | null |
| 工藤 | ○ | null | ○ |
| 赤井 | ○ | ○ | null |
| 渡辺 | ○ | null | null |
| 鈴木 | ○ | null | null |
Pivotと、Pivotの代用(集約関数とdecode関数)との比較
Pivotと、Pivotの代用(集約関数とdecode関数)は、使い分けるのがいいと思います。理由は下記です。
- 理由1:Pivotでは、暗黙のgroup byが実行され、暗黙のgroup byはイメージしにくい
- 理由2:Pivotで、不要な列を暗黙のgroup byの対象外にするには、インラインビューが必要
- 理由3:Pivotで計算式を使用するには、インラインビューが必要
理由1は、前述しましたので、理由2と3の例として、月ごとのValの合計を表示するselect文を比較してみましょう。
| dayCol | Val | bikou |
| 2010-01-10 | 10 | bikou1 |
| 2010-01-25 | 20 | bikou2 |
| 2010-02-07 | 60 | bikou3 |
| 2010-02-12 | 100 | null |
| 2010-03-11 | 200 | null |
| 2010-03-22 | 600 | bikou4 |
select sum(decode(extract(month from dayCol),1,Val)) as sum1, count(decode(extract(month from dayCol),1,Val)) as cnt1, sum(decode(extract(month from dayCol),2,Val)) as sum2, count(decode(extract(month from dayCol),2,Val)) as cnt2, sum(decode(extract(month from dayCol),3,Val)) as sum3, count(decode(extract(month from dayCol),3,Val)) as cnt3 from seals;
| sum1 | cnt1 | sum2 | cnt2 | sum3 | cnt3 |
| 30 | 2 | 160 | 2 | 800 | 2 |
select *
from (select extract(month from dayCol) as month,Val
from seals)
Pivot (sum(Val) as sum,
count(*) as cnt
for month in(1,2,3));
| 1_SUM | 1_CNT | 2_SUM | 2_CNT | 3_SUM | 3_CNT |
| 30 | 2 | 160 | 2 | 800 | 2 |
extract(month from dayCol)といった計算式を使ってPivotを行うには、インラインビューが必要となります。下記のselect文のように、extract(month from dayCol)といった計算式を使ってPivotを行うと文法エラーになるからです。
select *
from seals
Pivot (sum(Val) as sum,
count(*) as cnt
for extract(month from dayCol) in(1,2,3));
また、bikouという列が、暗黙のgroup byのグループ化のキーの1つになることを防ぐためにも、bikou列を除いたselect文を使ったインラインビューが必要となります。
