日期:2014-05-16 浏览次数:20477 次
?????????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)
?执行结果:
***
使用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
?执行结果:
?实际情况中要展示结果集中汇总列加上小计和合计,此时这样处理:
select decode(grouping_id(deptno,job),1,'小计',3,'总计',job||deptno) as group_col,sum(sal) from emp group by rollup(deptno,job)
执行结果:
?
?
?
?
扩展:http://msdn.microsoft.com/zh-cn/library/bb510624.aspx
?