select trade_date, deal_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by trade_date, deal_type;
2. 使用group by rollup()单列
select trade_date, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by rollup(trade_date);
可以看到,在最后一行做了汇总。
3. 使用group by rollup()多列
select trade_date, deal_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by rollup(trade_date, deal_type);
从上图可以看到:
#1.根据trade_date做了汇总;
#2.最后一行做了总的汇总。
按照rollup()的语法,是不会对deal_type做group by的。上面的SQL做了(trade_date,deal_type)的group by;(trade_date)的group by;以及对全表进行group by 操作。
如果是rollup()3列呢?
select trade_date, deal_type, deal_sub_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by rollup(deal_type, trade_date, deal_sub_type)
order by 1, 2, 3;
select trade_date, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by cube(trade_date);
跟rollup()对比,你会发现rollup()是在最后一行汇总,cube()是在第1行。
如果想在最后一行汇总,可以使用order by trade_date nulls last排序。
如下:
select trade_date, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by cube(trade_date)
order by trade_date nulls last;
5. 使用cube()多列
select trade_date, deal_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by cube(trade_date, deal_type)
order by 1 nulls last;
select grouping(trade_date),
trade_date,
grouping(deal_type),
deal_type,
sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by cube(trade_date, deal_type)
order by 1 nulls last;
select decode(grouping_id(trade_date), 1, '合计', trade_date),
decode(grouping_id(deal_type), 1, '合计', deal_type),
sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by cube(trade_date, deal_type)
order by 1 nulls last;
原来合计的列显示的空白,现在都显示的“合计”。
7. 使用grouping sets
select trade_date, deal_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by grouping sets(trade_date, deal_type)
order by 1 nulls last;
你可以看到,上面的效果不正等同于使用union all吗?
select trade_date, null, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by trade_date
union all
select null, deal_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by deal_type;