Oracle学习记录 十 高级分组学习

  1. group by cube

先执行一个语句看一下:

select deptno, job, sum(sal) sal from emp

group by cube(deptno, job)

order by sal;

这个输出结果可以看到,有deptno为空的,有job为空的,还有都为空的,当然还有两者都有的。

http://honeybinshun.iteye.com/blog/1474242

先对deptno,job进行group by 这个就是两者都有的那些项,然后对deptno进行group by,这个就是只有deptno那些项,

然后对job进行group by,这个就是只有job的那些项,然后还会求一次不group by 的,就是两者都为空的那项。

2. group by rollup

先执行一下这个:

select deptno, job, sum(sal) sal from emp

group by cube(deptno, job)

order by sal;

这里结果中有deptno,job都有的项,有只有deptno的项,还有两者都没有的项

执行是这样的,先对deptno,job进行group by,这样产生两者都有的项,然后对deptno执行group by,这样

产生只有deptno的项,然后还有一个是不group by 的,就是两者都为空的那项


其中,cube和rollup中可以有多个元素,

cube(A,B,C):(A,B,C)(A,B),(A,C),(A),(B,C),(B),(C)  这是它的group by情况 外加一次不group by

rollup(A,B,C): (A,B,C) (A,B) (A) 这是它的group by 情况,外加一次不group by的


3. grouping

这个是用来检查一行数据是否是cube产生的NULL,什么情况下需要这个呢?

想一下,刚才例子中,有时候是两者都有的项,有些是只有一者的项,那么,如果在原数据中,就是只有一者呢,

这样就无法区别开是原数据,还是聚合后的数据了,所以用grouping来区别,是就返回1,不是就返回0

http://www.cnblogs.com/li-peng/p/3298303.html

select deptno, job, sum(sal) sal, decode(grouping(deptno), 1, ‘Y‘, ‘N‘)

from emp

group by cube(deptno, job)

order by sal;

在这个结果中,只有deptno显示为空的项后面是Y,其他的都是N,这是因为本身deptno原数据中就没有是NULL的

显示Y的是因为现在deptno是NULL,说明是聚合产生的,显示N是因为这不是聚合产生的NULL或者这个根本不是NULL,

在这里就是因为deptno的值不是NULL,所以后面显示了N。









郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。