之前只知道group by
可以进行分组,今天才知道原来还有个group by roolup
函数,它可以对数据进行作和计算,在一些网站运营平台做数据统计时就很实用呀。
要了解group by rollup
的用法就要先与group by
作下对比,我们可以通过SCOTT
模式中的emp
表进行简单数据查询,以作比较。
scott.emp
表中的depno
,job
,sal
列的信息如下:
select deptno, job, sal from scott.emp;
对上述信息作group by
查询,结果如下:
select deptno, job , sum(sal) from scott.emp group deptno, job;
对信息作group by rollup
查询,结果如下:
select deptno, job , sum(sal) from scott.emp group by rollup(deptno, job);
可以看出数据库对除了对deptno
,job
列进行分组外,还对sal
列进行的了数值合计的运算。
1230 + 2450 + 5000 = 8750
...
8750 + 10875 + 9400 = 29025
实用扩展
在应用方面,对一些数据统计分析整合还是很方便的,比如根据下面的一个需求,可以作一个更复杂一些的查询。
需求:查询今日订单、昨日订单、今日手机订单、昨日手机订单,并且按小时统计:
/*想要一个sql 能看出今日订单昨日订单今日手机订单昨日手机订单 并且按小时统计手机包括app和h5*/
select
nvl(t.hour,'总计') hour,
sum(case when day='today' then 1 else 0 end) 今日订单,
sum(case when day='yesterday' then 1 else 0 end) 昨日订单,
sum(case when day='today' and type='mobi' then 1 else 0 end) 今日手机,
sum(case when day='yesterday' and type='mobi' then 1 else 0 end) 昨日手机
from ( select
case when o.createdatetime>=trunc(sysdate)
then 'today' else 'yesterday' end as day,
case when o.ordertypeid in (40,42,44,113,110,119,120,41,
43,45,114,111,112,31,107,117,118,86,103)
then 'mobi' else 'pc' end as type,
o.id
from t_order o
where o.createdatetime>=trunc(sysdate)-1
and not exists (select 1 from t_dynastate n
where n.objid=o.id
and n.objtype=102
and n.statetypeid=1
and n.statevalueid=1
)
) t
group by rollup(t.hour)