码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2015-03-09 11:09:16      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

  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。









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

标签:

原文地址:http://my.oschina.net/bxxfighting/blog/384156

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!