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

2014-11-24 17:00:44 · 作者: · 浏览: 1
回所有列组合的小计信息,同时在最后显示总计信息
下面两个语句只用到了一个分组列,所以返回的是一个总计。--ROLLUP总计在下面,CUBE的统计结果在上面。
SCOTT@bys1>SELECT nvl(to_char(deptno),'zongji'), avg(sal) FROM emp GROUP BY cube(deptno);
NVL(TO_CHAR(DEPTNO),'ZONGJI') AVG(SAL)
---------------------------------------- ----------
zongji 2073.21429
10 2916.66667
20 2175
30 1566.66667
下面语句用到了两个列。
可以看到下面查询产生了如下结果行:
1.是对(deptno,job)进行GROUP BY,即按部门、同一部门相同岗位GROUP BY。统计了同一部门相同岗位的平均工资及同一部门所有岗位的平均工资。
2.又对每个(job)进行GROUP BY,即不管部门,对表中所有行按JOB列进行GROUP BY。统计了各个岗位的平均工资
3.最后统计了所有员工的平均工资。即统计的第2步分组后的各种岗位的平均工资--也可能是全部员工的工资平均。
如果是GROUP BY CUBE(a,b,c);首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),再对全表进行GROUP BY。
即CUBE(1,2,N)时,GROUP BY的所有可能的GROUP BY数是2的N次方,比如CUBE(a,b,c);时,总共有8个。
SCOTT@bys1>SELECT nvl(to_char(deptno),'zongji') as deptno,job,avg(sal) FROM emp GROUP BY cube(deptno,job);
DEPTNO JOB AVG(SAL)
---------------------------------------- --------- ----------
zongji 2073.21429
zongji CLERK 1037.5
zongji ANALYST 3000
zongji MANAGER 2758.33333
zongji SALESMAN 1400
zongji PRESIDENT 5000
10 2916.66667
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 2175
20 CLERK 950
20 ANALYST 3000
20 MANAGER 2975
30 1566.66667
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 1400
实验总结:ROLLUP非常高效,对一个查询增加的开销非常少;CUBE相对更耗费资源。
在GROUP BY子句有列(a,b)两列时,ROLLUP统计(a,b),(a);而CUBE统计了(a,b),(a),(b)。
在此实验中就是:
ROLLUP统计了按(deptno,job)分组汇总,按(deptno)分组汇总,最后对全表进行GROUP BY操作。
CUBE统计了按(deptno,job)分组汇总,按(deptno)分组汇总,按(job)分组汇总,最后对全表进行GROUP BY操作。
#############################################################################################
4.grouping函数,解决在返会的结果中如何能准确区分出那些是小计,哪些是汇总数据。GROUPING只能在使用ROLLUP或CUBE的查询中使用。
对输入列返回0或1,如果该行数据使用了数据的列中的信息,即此列数据参与ROLLUP/CUBE函数分组汇总活动,则输出0;没有用到则输出1
或者说,对于该行得出的统计数据,需要从输入列中选择数据的话,输出0;不需要选择数据的就输出1
如下:GROUP BY rollup(deptno,job)时,可以看到在不同聚合统计列deptno,job字段的使用情况。0使用该字段,1未使用。
SCOTT@bys1>SELECT nvl(to_char(deptno),'zongji') as deptno,job,avg(sal),grouping(deptno),grouping(job) FROM emp GROUP BY rollup(deptno,job);
DEPTNO JOB AVG(SAL) GROUPING(DEPTNO) GROUPING(JOB)
---------------------------------------- --------- ---------- ---------------- -------------
10 CLERK 1300 0 0
10 MANAGER 2450 0 0
10 PRESIDENT 5000 0 0
10 2916.66667 0 1
20 CLERK 950 0 0
20 ANALYST 3000 0 0
20 MANAGER 297