OracleのPIVOT句
SQLで横持ちにデータを集計したい時に、PIVOT句を使うと便利だったのでメモ。
【元ネタ】
Oracle 11g検証 隠れた新機能検証 その1|おら! オラ! Oracle|技術情報|株式会社インサイトテクノロジー
Oracle 11g R1新機能のPivotとUnPivot(1/5):CodeZine
OracleのSCOTTスキーマにある従業員テーブルで、JOB(仕事)とDNAME(部門)ごとに集計したい場合、下記のSQLで書ける。
select emp.deptno,dname
,sum(decode(job,'CLERK' ,sal,null)) "CLERK"
,sum(decode(job,'MANAGER' ,sal,null)) "MANAGER"
,sum(decode(job,'PRESIDENT',sal,null)) "PRESIDENT"
,sum(decode(job,'ANALYST' ,sal,null)) "ANALYST"
,sum(decode(job,'SALESMAN' ,sal,null)) "SALESMAN"
from emp,dept
where emp.deptno = dept.deptno
group by emp.deptno,dname
order by emp.deptno,dname;
PIVOT句を使うともっと簡単に書ける。
select * from ( select emp.deptno,dname,job,sal
from emp,dept
where emp.deptno = dept.deptno )
pivot ( sum(sal) for job
in ('CLERK','MANAGER','PRESIDENT','ANALYST','SALESMAN') )
order by deptno,dname;
PIVOT句を使う状況は、月別に横持ちでデータを表示したい時がある。
例えば、月別に部門ごとに売上金額を集計したい時など。
いわゆるクロス集計で使えると思う。
クロス集計されたデータをCSV出力すれば、Excelで簡単にグラフ化して、レポート用に整形できる。
チケット駆動開発ならば、ステータスとトラッカー・カテゴリ・バージョン・担当者のクロス集計の出力にも使えそうな機能だろう。
再帰SQLと同様にSQLは実は奥が深いのだ。
| 固定リンク
「プログラミング」カテゴリの記事
- Javaのモジュールシステムの考え方をまとめてみた(2022.10.21)
- Javaのモジュールシステムは複雑性をより増している(2022.09.10)
- Javaはなぜ関数型言語になろうとしているのか(2022.09.02)
- Javaのラムダ式の考え方(2022.08.10)
- Javaはオブジェクト指向言語ではなく関数型言語だった~「[増補改訂]関数プログラミング実践入門」はお勧めの本だ(2022.08.06)
「モデリング」カテゴリの記事
- チームトポロジーの感想~大規模アジャイル開発でも組織構造は大きく変化する(2025.01.01)
- アーキテクチャ設計はベストプラクティスを参照するプロセスに過ぎないのか?~Software Processes are Software, Too(ソフトウェアプロセスもまたソフトウェアである)(2024.09.22)
- 「システム開発・刷新のためのデータモデル大全」を読み直した感想~親子頻出アンチパターンは初心者モデラーに多い(2024.08.31)
- 「システムアーキテクチャ構築の原理」の感想part2~非機能要件がシステムのアーキテクチャに影響を与える観点をプロセス化する(2024.05.06)
- 「システムアーキテクチャ構築の原理」の感想(2024.05.06)
「チケット駆動開発」カテゴリの記事
- Redmineは組織のナレッジ基盤として実現可能なのか~島津製作所の事例を読み解く #redmineT(2024.12.29)
- 第26回redmine.tokyo勉強会の感想~多様性はコミュニティが成功する重要な要因の一つ #redmineT(2024.06.15)
- チケットはデータでとプロセスの二面性を持つ #redmine(2023.12.24)
- 小説活動にプルリクエスト駆動が必要になってきた(2022.05.08)
- 知識は経験よりも大切か、経験は知識よりも勝るのか、SECIモデルは相互作用を語る(2022.04.26)
コメント