トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
3-42 rollUpで各値と小計と総合計も表示
SQLパズル
AmountTable
dayC Val
---------- ---
2010-06-01 10
2010-06-13 20
2010-06-23 60
2010-07-11 100
2010-07-13 200
2010-07-22 500
月ごとの小計と総合計を表示する。
出力結果
gr Val
-------------- ---
2010-06-01 10
2010-06-13 20
2010-06-23 60
subTotal of 06 90
2010-07-11 100
2010-07-13 200
2010-07-22 500
subTotal of 07 800
Total 890
データ作成スクリプト
create table AmountTable(dayC,Val) as
select date '2010-06-01', 10 from dual union all
select date '2010-06-13', 20 from dual union all
select date '2010-06-23', 60 from dual union all
select date '2010-07-11',100 from dual union all
select date '2010-07-13',200 from dual union all
select date '2010-07-22',500 from dual;
SQL
--■■■grouping setsを使う方法■■■
select case grouping_ID(mon,dayC)
when 2+1 then 'total'
when 0+1 then 'Sub-Total of ' || mon
else dayC end as gr,
sum(Val) as Val
from (select to_char(dayC,'yyyy-mm-dd') as dayC,
to_char(dayC,'mm') as mon,Val
from AmountTable)
group by grouping sets((),mon,dayC)
order by max(dayC),grouping_ID(dayC,mon);
--■■■rollUpを使う方法■■■
select case grouping_ID(mon,dayC)
when 2+1 then 'total'
when 0+1 then 'Sub-Total of ' || mon
else dayC end as gr,
sum(Val) as Val
from (select to_char(dayC,'yyyy-mm-dd') as dayC,
to_char(dayC,'mm') as mon,Val
from AmountTable)
group by rollUp(mon,dayC)
order by max(dayC),grouping_ID(dayC,mon);
解説
事前にインラインビューで加工した列に列別名をつけておいてから、
grouping setsやrollUpを使うといいでしょう。
grouping setsとrollUpは、脳内でのイメージしやすさで使い分けるといいでしょう。
rollUpは、
rollUp(年,四半期,月,上旬とか下旬,日)
といった集計を行うときに特に便利ではあります。
10-293 TotalとGrandTotalを求める
US-OTN --- I like grouping sets