暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

高级分组rollup,cube操作

Oracle微学堂 2019-05-31
791
Rollup分组

按部门分组

select deptno,sum(sal) from emp group by deptno;

DEPTNO SUM(SAL)

------ ----------

30 9400

20 6775

10 8750

按部门分组,并求总计

select deptno,sum(sal) from emp group by rollup(deptno);

DEPTNO SUM(SAL)

------ ----------

10 8750

20 6775

30 9400

24925

Rollup分组,一次全表扫描


select deptno,sum(sal) from emp group by rollup(deptno);

-----------------------------------------------------------------------

分解为下列语句

select deptno,sum(sal) from emp group by deptno

union all

select null,sum(sal) from emp

order by 1;

两次扫描表,效率低

Group by Rollup(a,b,c,d)

的结果集为,共n+1个集

Group by a,b,c,d

Union all

Group by a,b,c

Union all

Group by a,b

Union all

Group by a

Union all

Group by null

select deptno,job,sum(sal) from emp group by rollup(deptno,job);

DEPTNO JOB SUM(SAL)

------ --------- ----------

10 CLERK 1300

10 MANAGER 2450

10 PRESIDENT 5000

10 8750

20 CLERK 800

20 ANALYST 3000

20 MANAGER 2975

20 6775

30 CLERK 950

30 MANAGER 2850

30 SALESMAN 5600

30 9400

24925

结果为

select deptno,job,sum(sal) from emp group by deptno,job

union all

select deptno,null,sum(sal) from emp group by deptno

union all

select null,null,sum(sal) from emp;

Grouping(列名称)的使用,为了表达该列是否参加了分组活动。

0为该列参加了分组,1为该列未参加分组操作

select deptno,job,grouping(deptno),grouping(job),sum(sal)

from emp group by rollup(deptno,job);

DEPTNO JOB GROUPING(DEPTNO) GROUPING(JOB) SUM(SAL)

------ --------- ---------------- ------------- ----------

10 CLERK 0 0 1300

10 MANAGER 0 0 2450

10 PRESIDENT 0 0 5000

10 0 1 8750

20 CLERK 0 0 800

20 ANALYST 0 0 3000

20 MANAGER 0 0 2975

20 0 1 6775

30 CLERK 0 0 950

30 MANAGER 0 0 2850

30 SALESMAN 0 0 5600

30 0 1 9400

Cube分组

select deptno,job,grouping(deptno),

grouping(job) ,sum(sal) from emp group by cube(deptno,job);

结果集为,2**n个结果集

select deptno,job,sum(sal) from emp group by deptno,job

union all

select deptno,null,sum(sal) from emp group by deptno

union all

select null,job,sum(sal) from emp group by job

union all

select null,null,sum(sal) from emp;

扫描二维码关注我的微学堂

搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!



最后修改时间:2019-12-20 16:17:33
文章转载自Oracle微学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论