日期:2014-05-16  浏览次数:20562 次

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       &n