Orcle Group By字句的增强

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值