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

Oracle学习:group by扩展三部曲之三-- grouping sets

oracleEDU 2017-12-01
1531

GROUPING SETS进行分组自定义的汇总,以下通过案例详细描述。

测试环境

SQL> drop table dept purge;

SQL> drop table emp purge;

SQL> create table dept as select * from scott.dept;

SQL> create table emp  as select * from scott.emp;

SQL> set term off

SQL> set heading on

SQL> set verify off

SQL> set feedback off

SQL> set linesize 2000

SQL> set pagesize 30000

SQL> set long 999999999

SQL> set longchunksize 999999

SQL> set autotrace on explain

GROUPING SETS分组案例

SQL> SELECT to_char(b.hiredate,'yyyy') hire_year,a.dname,b.job, SUM(sal) sum_sal

FROM dept a,emp b 

WHERE a.deptno = b.deptno

GROUP BY GROUPING SETS(to_char(b.hiredate,'yyyy'),a.dname,b.job);

以上语句的等价写法

(不但复杂,性能也差)

SQL> SELECT to_char(b.hiredate,'yyyy') hire_year,null as dname,null as job,SUM(sal) sum_sal

FROM dept a,emp b 

WHERE a.deptno = b.deptno

GROUP BY to_char(b.hiredate,'yyyy')

UNION ALL

SELECT null as hire_date,a.dname,null as job,SUM(sal) sum_sal

FROM dept a,emp b 

WHERE a.deptno = b.deptno

GROUP BY null,a.dname,null

UNION ALL 

SELECT null as hire_year,null as dname,b.job,SUM(sal) sum_sal

FROM dept a,emp b 

WHERE a.deptno = b.deptno

GROUP BY null,null,b.job;

部分字段GROUPING SETS 分组

SQL> set autotrace off

SQL> SELECT a.dname,to_char(b.hiredate,'yyyy') hire_year,b.job, SUM(sal) sum_sal

FROM dept a,emp b 

WHERE a.deptno = b.deptno

GROUP BY a.dname, GROUPING SETS(to_char(b.hiredate,'yyyy'),b.job);

CUBE、ROLLUP 作为GROUPING SETS 的参数例子

SQL> SELECT a.dname,b.job, SUM(sal) sum_sal

FROM dept a,emp b 

WHERE a.deptno = b.deptno

GROUP BY GROUPING SETS(ROLLUP(a.dname),ROLLUP(b.job));

等同的低效写法:

SQL> SELECT a.dname,NULL job, SUM(sal) sum_sal

FROM dept a,emp b 

WHERE a.deptno = b.deptno

GROUP BY ROLLUP(a.dname)

UNION ALL

SELECT NULL dname,b.job, SUM(sal) sum_sal

FROM dept a,emp b 

WHERE a.deptno = b.deptno

GROUP BY  ROLLUP(b.job);

最后修改时间:2021-04-28 20:32:25
文章转载自oracleEDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论