Oracle中的groupbyrollup学习

2017-01-07 19:13:45来源:作者:人点击

Oracle中的groupbyrollup学习。之前只知道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)

这里写图片描述

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台