当你与COUNT和SUM这类总计函数一起使用GROUP BY语句时,你一般得不到多级总数。GROUP BY中每个唯一的列组合生成一个总数,但这些总数不会“累加”到更高一级的总数中
要实现这一点,你可以用GROUP BY ROLLUP或GROUP BY CUBE替代GROUP BY,不过它们会生成所有可能的总数,而你可能不需要全部总数。对GROUP BY CUBE而言,将会生成2^n组总数,这里的n是GROUP BY中列的数目。
SQL> select grouping(deptno),grouping(job),deptno,job,sum(sal),avg(sal) from emp group by cube(deptno,job) order by 3,4;
GROUPING(DEPTNO) GROUPING(JOB) DEPTNO JOB SUM(SAL) AVG(SAL)
---------------- ------------- ---------- --------- ---------- ----------
0 0 10 CLERK 1300 1300
0 0 10 MANAGER 2450 2450
0 0 10 PRESIDENT 5000 5000
0 1 10 8750 2916.66667
0 0 20 ANALYST 6000 3000
0 0 20 CLERK 1900 950
0 0 20 MANAGER 2975 2975
0 1 20 10875 2175
0 0 30 CLERK 950 950
0 0 30 MANAGER 2850 2850
0 0 30 SALESMAN 5600 1400
0 1 30 9400 1566.66667
1 0 ANALYST 6000 3000
1 0 CLERK 4150 1037.5
1 0 MANAGER 8275 2758.33333
1 0 PRESIDENT 5000 5000
1 0 SALESMAN 5600 1400
1 1 29025 2073.21429
18 rows selected.
其中当grouping()的值为1时表示该字段在相应行的统计中未被使用,当其值为0时,表示该字段在相应行的统计中被使用。It is used to find the groups forming the subtotal in a row,and it can onl be used with rollup and cube operators specified in the group by clause.
此外关于grouping()还可以如下使用:
SQL> select case grouping(job) when 0 then job else 'sum_total' end job ,sum(sal),avg(sal) from emp group by rollup(job) order by job;
JOB SUM(SAL) AVG(SAL)
--------- ---------- ----------
ANALYST 6000 3000
CLERK 4150 1037.5
MANAGER 8275 2758.33333
PRESIDENT 5000 5000
SALESMAN 5600 1400
sum_total 29025 2073.21429
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28612416/viewspace-773766/ ,如需转载,请注明出处,否则将追究法律责任。