トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

8-35 小計を含むpivot

SQLパズル

PivotWithTotalテーブル
mgr   DNo  Val
----  ---  ----
7566   20  6000
7698   30  6550
7782   10  1300
7788   20  1100
7839   10  2450
7839   20  2975
7839   30  2850
7902   20   800

mgrごとの各DNoのValの値と、
合計を下記の形式で出力する。

出力結果
mgr   D10    D20   D30   Total
----  ----  -----  ----  -----
7566     0   6000     0  null
7698     0      0  6550  null
7782  1300      0     0  null
7788     0   1100     0  null
7839  2450   2975  2850  null
7902     0    800     0  null
null  3750  10875  9400  24025

SQLクックブックのレシピ12.20を参考にさせていただきました


データ作成スクリプト

create table PivotWithTotal(mgr,DNo,Val) as
select 7566,20,6000 from dual union all
select 7698,30,6550 from dual union all
select 7782,10,1300 from dual union all
select 7788,20,1100 from dual union all
select 7839,10,2450 from dual union all
select 7839,20,2975 from dual union all
select 7839,30,2850 from dual union all
select 7902,20, 800 from dual;


SQL

select mgr,
sum(decode(DNo,10,Val,0)) as D10,
sum(decode(DNo,20,Val,0)) as D20,
sum(decode(DNo,30,Val,0)) as D30,
case grouping(mgr)
when 1 then sum(Val) end as Total
  from PivotWithTotal
group by grouping sets(mgr,())
order by mgr;


解説

grouping setsの使いどころですね。