SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Oracle 11g R1新機能のPivotとUnPivot

select文で縦横変換

ダウンロード SourceCode (2.6 KB)

2. Pivotで行列変換 (行⇒列)

 まずは、『外部結合の使い方』の(行→列)と同じ結果をPivotで取得してみます。サンプルを見てみましょう。

Courses
name course
赤井 SQL入門
赤井 UNIX基礎
鈴木 SQL入門
工藤 SQL入門
工藤 Java中級
吉田 UNIX基礎
渡辺 SQL入門
Pivotの代用(集約関数とdecode関数)
select name,
max(decode(course,'SQL入門' ,'○')) as "SQL入門",
max(decode(course,'UNIX基礎','○')) as "UNIX基礎",
max(decode(course,'Java中級','○')) as "Java中級"
  from Courses
group by name
order by name;
出力結果
name SQL入門 UNIX基礎 Java中級
吉田 null null
工藤 null
赤井 null
渡辺 null null
鈴木 null null

 Pivotを使ったselect文で同じ結果を取得してみます。

Pivotを使ったselect文
select name,NewColumnName1,NewColumnName2,NewColumnName3
  from Courses
 pivot (max('○') for course in('SQL入門'  as NewColumnName1,
                                'UNIX基礎' as NewColumnName2,
                                'Java中級' as NewColumnName3))
order by name;
出力結果
name NewColumnName1 NewColumnName2 NewColumnName3
吉田 null null
工藤 null
赤井 null
渡辺 null null
鈴木 null null

 Pivotの構文は、下記のように理解しておくといいでしょう。

Pivotの構文
Pivot(集約関数 for 集約条件列 in(集約条件値1 as 集約後列名1,
                                 集約条件値2 as 集約後列名2,
                                 集約条件値3 as 集約後列名3));

 Pivotでは、集約関数で使用している列でなく、かつ集約条件列で使用している列でもない列で暗黙のgroup byが実行されます。

 上記のselect文においては、集約関数で使用している列は、なしです。なぜならmax('○')と固定値である'○'を指定しているからです。そして、集約条件列で使用している列は、course列です。よって、集約関数で使用している列でなく、かつ集約条件列で使用している列でもないNAME列で暗黙のgroup byが実行されます。

 Pivotの脳内のイメージは下記となります。暗黙のgroup byによる赤線をイメージし、for 集約条件列(上記のselect文では、for courseの部分)で黄緑線をイメージしてます。

SQLのイメージ
SQLのイメージ

 下記のように、max('○')ではなく、固定値の'○'を記述すると、文法エラー 「ORA-56902: ピボット操作では集計関数を使用する必要があります」が発生してしまいます。

文法エラー
select name,NewColumnName1,NewColumnName2,NewColumnName3
  from Courses
 pivot ('○' for course in('SQL入門'  as NewColumnName1,
                           'UNIX基礎' as NewColumnName2,
                           'Java中級' as NewColumnName3));

次のページ
新規列の列名の省略

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

山岸 賢治(ヤマギシ ケンジ)

趣味が競技プログラミングなWebエンジニアで、OracleSQLパズルの運営者。AtCoderの最高レーティングは1204(水色)。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4985 2010/04/14 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー