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

2014-11-24 17:00:44 · 作者: · 浏览: 2
5 0 0
20 2175 0 1
30 CLERK 950 0 0
30 MANAGER 2850 0 0
30 SALESMAN 1400 0 0
30 1566.66667 0 1
zongji 2073.21429 1 1
如下:GROUP BY cube(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 cube(deptno,job);
DEPTNO JOB AVG(SAL) GROUPING(DEPTNO) GROUPING(JOB)
---------------------------------------- --------- ---------- ---------------- -------------
zongji 2073.21429 1 1
zongji CLERK 1037.5 1 0
zongji ANALYST 3000 1 0
zongji MANAGER 2758.33333 1 0
zongji SALESMAN 1400 1 0
zongji PRESIDENT 5000 1 0
10 2916.66667 0 1
10 CLERK 1300 0 0
10 MANAGER 2450 0 0
10 PRESIDENT 5000 0 0
20 2175 0 1
20 CLERK 950 0 0
20 ANALYST 3000 0 0
20 MANAGER 2975 0 0
30 1566.66667 0 1
30 CLERK 950 0 0
30 MANAGER 2850 0 0
30 SALESMAN 1400 0 0
5.grouping SETS函数
只返回统计信息,就是上一个查询中提出两个 GROUPING 的两个列全为0或全为1的都过滤掉。
SCOTT@bys1>SELECT nvl(to_char(deptno),'zongji') as deptno,job,avg(sal),grouping(deptno),grouping(job) FROM emp GROUP BY grouping sets(deptno,job);
DEPTNO JOB AVG(SAL) GROUPING(DEPTNO) GROUPING(JOB)
---------------------------------------- --------- ---------- ---------------- -------------
zongji CLERK 1037.5 1 0
zongji SALESMAN 1400 1 0
zongji PRESIDENT 5000 1 0
zongji MANAGER 2758.33333 1 0
zongji ANALYST 3000 1 0
30 1566.66667 0 1
20 2175 0 1
10 2916.66667 0 1
不过当查询只有一个聚合列时,是将全表统计的给过滤了:
SCOTT@bys1>SELECT deptno, avg(sal),grouping(deptno) FROM emp GROUP BY cube(deptno);
DEPTNO AVG(SAL) GROUPING(DEPTNO)
---------- ---------- ----------------
2073.21429 1
10 2916.66667 0
20 2175 0
30 1566.66667 0
SCOTT@bys1>SELECT deptno, avg(sal),grouping(deptno) FROM emp GROUP BY grouping sets(deptno);
DEPTNO AVG(SAL) GROUPING(DEPTNO)
---------- ---------- -----------