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)
「モデリング」カテゴリの記事
- JSTQBのテストプロセスの概念モデルを描いてみた(2023.05.26)
- 第85回IT勉強宴会の感想~概念データモデルからビジネスモデルを構築すべきという考え方(2023.05.13)
- ストラテジストとプロジェクトマネージャの役割の違いは何なのかpart2~プロセスのレイヤと達成目標のレイヤが異なる(2023.02.18)
- UMTPモデリングフォーラムのパネル討論の感想(2022.11.29)
- Go言語でできることは何なのか(2022.11.06)
「チケット駆動開発」カテゴリの記事
- 小説活動にプルリクエスト駆動が必要になってきた(2022.05.08)
- 知識は経験よりも大切か、経験は知識よりも勝るのか、SECIモデルは相互作用を語る(2022.04.26)
- プロジェクト管理の基本はテーラリング、Redmineはプロセスをテーラリングするツール(2022.04.21)
- タスク分割は親子チケットにすべきか、それともチェックリストにすべきか #redmine(2022.03.04)
- Redmineにメンション機能が入るらしい(2022.01.15)
コメント