【读书】带你一步步理解group by 后使用 rollup 子句的好处

导言
因为自己的系统就是一个简单的oltp系统,没有数据仓库相关的功能,今天在剖析一个存储过程的时候定位一个过程中的sql存在性能问题,各种改写以后还是效率很低,于是找oracle是不是有相关的语法,刚好找到了group by rollup ,下面整理一下用法方便以后自己查看。

需求如下:

–统计每个部门每个职位的工资总和
select d.deptno,d.dname,e.job,sum(e.sal) from emp e,dept d
where e.deptno =d.deptno
group by d.deptno,d.dname,e.job;

–统计每个部门所有职位的工资总和
with t as (select d.deptno,d.dname,e.job,sum(e.sal) as sumsal from emp e,dept d
where e.deptno =d.deptno
group by d.deptno,d.dname,e.job)
select deptno,dname,sum(sumsal) from t
group by deptno,dname;

–统计所有部门所有职位的工资总和
select null,null,sum(e.sal) from emp e,dept d
where e.deptno =d.deptno;

最后的报表结果:
【读书】带你一步步理解group by 后使用 rollup 子句的好处_第1张图片
备注说白了最后的结果就是统计各个部门各个岗位的薪水总和,并且最后统计出部门的薪水总和

如果用union all会出现多次访问emp和dempt表的情况,用with语句也只是稍微的提高一点性能,如果统计的字段成千上万以后,with看起来就会很费劲。

现在改造成group by rollup
select d.dname,e.job,sum(e.sal) from emp e,dept d
where e.deptno =d.deptno
group by rollup(d.dname,e.job)
【读书】带你一步步理解group by 后使用 rollup 子句的好处_第2张图片

你可能感兴趣的:(oracle运维+开发)