Oracle 中的 group by rollup 学习

之前只知道group by可以进行分组,今天才知道原来还有个group by roolup函数,它可以对数据进行作和计算,在一些网站运营平台做数据统计时就很实用呀。

要了解group by rollup的用法就要先与group by作下对比,我们可以通过SCOTT模式中的emp表进行简单数据查询,以作比较。

scott.emp表中的depnojobsal列的信息如下:
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); 

这里写图片描述

可以看出数据库对除了对deptnojob列进行分组外,还对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)

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值