求列累计oracle rollup,oracle-rollup 跟cube分组累计求和

本文详细介绍了Oracle数据库中Rollup和Cube分组函数的使用,包括它们如何进行纵向和横向的小计计算。通过示例展示了如何利用GROUPING_ID函数筛选特定分组级别的记录,并解释了GROUPING_ID的计算方式。此外,还提供了如何在结果集中展示汇总列和小计的方法。文章最后给出了扩展阅读链接,进一步深入理解这些高级分组功能。
摘要由CSDN通过智能技术生成

oracle--rollup 和cube分组累计求和

group by 语句支持基本的having条件,还支持rollup和cube提供信息汇总功能,类似小计。

rollup:纵向小计,从右向左逐个对每一列进行小结并在结果中生成独立的一行。只返回第一个分组条件指定的列的统计行。

cube:横行小计

select d.deptno,t.job,sum(t.sal) from emp t,dept d

where t.deptno=d.deptno

group by rollup(d.deptno,t.job)

执行结果:

0442545150.jpg

***

使用grouping_id显示指定的分组级别的记录。返回grouping()位向量的十进制值,GROUPING位向量的计算方法是将按照顺序对每一列调用GROUPING函数的结果组合起来。

例:grouping_id(a,b,c),a为空就是0非空为1,b和c也一样,结果会得到一个三位数,用二进制转换成十进制就是了,a,b,c全是非空,即111就是7,三列就是7,如果是两列自然是11就是3

select ... from 表 group by rollup(.....) having grouping_id(....)<=1

rollup(x,y)2列

rollup(x,y,z)3列

总计是grouping_id=3

总计是grouping_id=7

小计grouping_id=1

小计grouping_id=3

记录是grouping_id=0

记录是grouping_id=0

此时要求不显示最后总计行:

select d.deptno,t.job,sum(t.sal) from emp t,dept d

where t.deptno=d.deptno

group by rollup(d.deptno,t.job)having grouping_id(d.deptno,t.job)<=1

执行结果:

0442545150.jpg

实际情况中要展示结果集中汇总列加上小计和合计,此时这样处理:

select decode(grouping_id(deptno,job),1,'小计',3,'总计',job||deptno)

as group_col,sum(sal) from emp

group by rollup(deptno,job)

执行结果:

0442545151.jpg

扩展:http://msdn.microsoft.com/zh-cn/library/bb510624.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值