当前位置:操作系统 > Unix/Linux >>

GROUP BY中ROLLUP/CUBE/GROUPING/GROUPING SETS使用示例

GROUP BY中ROLLUP/CUBE/GROUPING/GROUPING SETS使用示例
 
oracle group by中rollup和cube的区别:
Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。CUBE ROLLUP 是用于统计数据的。
实验使用SCOTT用户的EMP表测试
1.仅使用GROUP BY分组,GROUP BY后的单列可以用括号,也可以不用。以下两种写法作用一样:
SCOTT@bys1>SELECT deptno, avg(sal) FROM emp  GROUP BY deptno;
SCOTT@bys1>SELECT deptno, avg(sal) FROM emp  GROUP BY (deptno);
    DEPTNO   AVG(SAL)
---------- ----------
        30 1566.66667
        20       2175
        10 2916.66667
正常分组,GROUP BY后的多个列之前要用逗号隔开,列名可以写到 括号里,也可以不使用括号。
下面三种写法作用一样:
SCOTT@bys1>SELECT nvl(to_char(deptno),'heji') ,job, avg(sal) FROM emp  GROUP BY (job,deptno);
SCOTT@bys1>SELECT deptno,job, avg(sal) FROM emp  GROUP BY (job,deptno);
SCOTT@bys1>SELECT deptno,job, avg(sal) FROM emp  GROUP BY job,deptno;
    DEPTNO JOB         AVG(SAL)
---------- --------- ----------
        20 MANAGER         2975
        10 PRESIDENT       5000
        10 CLERK           1300
        30 SALESMAN        1400
        20 ANALYST         3000
        30 MANAGER         2850
        10 MANAGER         2450
        30 CLERK            950
        20 CLERK            950
##################################################################################
2.在GROUP BY语句中使用ROLLUP:
使用ROLLUP操作符时,在生成原有统计结果基础上,生成横向小计结果。
为每个分组返回一条小计记录,并为全部分组返回总计。
下面两个语句只用到了一个分组列,所以返回的是一个总计。
SCOTT@bys1>SELECT deptno, avg(sal) FROM emp  GROUP BY rollup(deptno);
    DEPTNO   AVG(SAL)
---------- ----------
        10 2916.66667
        20       2175
        30 1566.66667
           2073.21429
使用NVL,如果deptno列为NULL,则用'heji'。可以使结果更美观。
SCOTT@bys1>SELECT nvl(to_char(deptno),'heji') as deptno, avg(sal) FROM emp  GROUP BY rollup(deptno);
DEPTNO                                     AVG(SAL)
---------------------------------------- ----------
10                                       2916.66667
20                                             2175
30                                       1566.66667
heji                                     2073.21429
下面语句用到了两个列。
可以看到下面查询产生了如下结果行:-----它按照grouping list列从右到左进行更高层的聚合
1.对(deptno,job)进行GROUP BY,即按部门分组,相同部门里再按相同岗位进行分组。聚合统计同一部门相同岗位的平均工资。
2.对分组后的(deptno)进行GROUP BY,即相同部门的分组聚合统计。这里就是统计同一部门所有人的平均工资
3.对所有员工的平均工资聚合统计
这里如果是GROUP BY rollup(a,b,c);对(a,b,c)三列分组的话,就是先对(a,b,c)进行GROUP BY,再对(a,b)进行GROUP BY,再对(a)进行GROUP BY,再对全表GROUP BY。
即ROLLUP(1,2,N)时,GROUP BY的所有可能的GROUP BY数是2+N个,比如CUBE(a,b,c);时,总共有4个。
SCOTT@bys1>SELECT nvl(to_char(deptno),'heji') as deptno,job,avg(sal) FROM emp  GROUP BY rollup(deptno,job);
DEPTNO                                   JOB         AVG(SAL)
---------------------------------------- --------- ----------
10                                       CLERK           1300
10                                       MANAGER         2450
10                                       PRESIDENT       5000
10                                                 2916.66667
20                                       CLERK            950
20                                       ANALYST         3000
20                                       MANAGER         2975
20                                                       2175
30                                       CLERK            950
30                                       MANAGER         2850
30                                       SALESMAN        1400
30                                                 1566.66667
heji                                               2073.21429
########################################################################################################
3.在GROUP BY中使用CUBE:
使用CUBE操作符时,在生成原有统计结果基础上,生成纵向小计结果。
返回所有列组合的小计信息,同时在最后显示总计信息
下面两个语句只用到了一个分组列,所以返回的是一个总计。--ROLLUP总计在下面,CUBE的统计结果在上面。
SCOTT@bys1>SELECT nvl(to_char(deptno),'zongji'), avg(sal) FROM emp  GROUP BY cube(deptno);
NVL(TO_CHAR(DEPTNO),&#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,