Orcle中支持对Group BY字句增强:ROLLUP、CUBE、GROUPING和GROUPING SETS
1.ROLLUP
在Group By 中使用Rollup 产生常规分组汇总行 以及分组小计:
SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
GROUP BY ROLLUP(department_id, job_id);
1、常规分组行;2,3 、分层小计行; Rollup 后面跟了n个字段,就将进行n+1次分组,从右到左每次减少一个字段进行分组;然后进行 union
2.CUBE
在Group By 中使用Cube 产生Rollup结果集 + 多维度的交叉表数据源:
SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
GROUP BY CUBE (department_id, job_id) ;
1、常规分组行;2,3 、4 分层小计行;其中3是交叉表数据源需要的 job_id 维度层面的小计。 Cube 后面跟了n个字段,就将进行2的N次方的分组运算,然后进行union
3.GROUPING
GROUPING函数:Rollup 和 Cube有点抽象,他分别相当于n+1 和 2的n次方常规 Group by 运 算;那么在Rollup 和 Cube的结果集中如何很明确的看出哪些行是针对那些列或者列的组合进行 分组运算的结果的? 答案是可以使用Grouping 函数; 没有被Grouping到返回1,否则返回0
SELECT department_id DEPTID, job_id JOB,
SUM(salary),
GROUPING(department_id) GRP_DEPT,
GROUPING(job_id) GRP_JOB
FROM employees
WHERE department_id < 50
GROUP BY ROLLUP(department_id, job_id);
第1行, department_id 和 job_id都被用到了,所以都返回0; 第2行, job_id 没有被用到,所以返 回1;第3行,department_id 和job_id 都没有被用到,所以都返回1
4.GROUPING SETS
使用Grouping Set 来代替多次UNION:
SELECT department_id, job_id,
manager_id,avg(salary)
FROM employees
GROUP BY GROUPING SETS
((department_id,job_id), (job_id,manager_id));
会分别根据SETS中的各个子集合进行分组,然后进行union