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