标签:
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。
标签:
原文地址:http://my.oschina.net/bxxfighting/blog/384156