Oracle PL/SQL之GROUP BY GROUPING SETS
[转自] http://blog.csdn.net/t0nsha/article/details/6538838
使用GROUP BY GROUPING SETS相当于把需要GROUP的集合用UNION ALL联合起来。
当GROUPING SETS里面的分组元素越多时,使用GROUPING SETS比使用UNION ALL性能更好,这可能和使用GROUPING SETS只需要访问一次表有关。
如下两段查询的结果是相等的:
q1(GROUPING SETS):
- SELECT department_id, job_id, manager_id, AVG (salary)
- FROM employees
- GROUP BY GROUPING SETS ((department_id, job_id), (job_id, manager_id));
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- SH_CLERK 122 3200
- AC_MGR 101 12000
- ST_MAN 100 7280
- ST_CLERK 121 2675
- SA_REP 148 8650
- SH_CLERK 120 2900
- SH_CLERK 124 2825
- MK_MAN 100 13000
- AD_PRES 24000
- FI_MGR 101 12000
- SA_REP 146 8500
- SH_CLERK 123 3475
- AD_ASST 101 4400
- IT_PROG 102 9000
- IT_PROG 103 4950
- FI_ACCOUNT 108 7920
- PU_MAN 100 11000
- ST_CLERK 122 2700
- SA_REP 145 8500
- AC_ACCOUNT 205 8300
- AD_VP 100 17000
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- ST_CLERK 120 2625
- ST_CLERK 124 2925
- SA_REP 147 7766.66667
- SA_REP 149 8333.33333
- HR_REP 101 6500
- PR_REP 101 10000
- ST_CLERK 123 3000
- SH_CLERK 121 3675
- PU_CLERK 114 2780
- SA_MAN 100 12200
- MK_REP 201 6000
- 110 AC_ACCOUNT 8300
- 90 AD_VP 17000
- 50 ST_CLERK 2785
- 80 SA_REP 8396.55172
- 50 ST_MAN 7280
- 80 SA_MAN 12200
- 110 AC_MGR 12000
- 90 AD_PRES 24000
- 60 IT_PROG 5760
- 100 FI_MGR 12000
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- 30 PU_CLERK 2780
- 50 SH_CLERK 3215
- 20 MK_MAN 13000
- 100 FI_ACCOUNT 7920
- SA_REP 7000
- 70 PR_REP 10000
- 30 PU_MAN 11000
- 10 AD_ASST 4400
- 20 MK_REP 6000
- 40 HR_REP 6500
- 52 rows selected.
SELECT department_id, job_id, manager_id, AVG (salary)
FROM employees
GROUP BY GROUPING SETS ((department_id, job_id), (job_id, manager_id));
DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
------------- ---------- ---------- -----------
SH_CLERK 122 3200
AC_MGR 101 12000
ST_MAN 100 7280
ST_CLERK 121 2675
SA_REP 148 8650
SH_CLERK 120 2900
SH_CLERK 124 2825
MK_MAN 100 13000
AD_PRES 24000
FI_MGR 101 12000
SA_REP 146 8500
SH_CLERK 123 3475
AD_ASST 101 4400
IT_PROG 102 9000
IT_PROG 103 4950
FI_ACCOUNT 108 7920
PU_MAN 100 11000
ST_CLERK 122 2700
SA_REP 145 8500
AC_ACCOUNT 205 8300
AD_VP 100 17000
DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
------------- ---------- ---------- -----------
ST_CLERK 120 2625
ST_CLERK 124 2925
SA_REP 147 7766.66667
SA_REP 149 8333.33333
HR_REP 101 6500
PR_REP 101 10000
ST_CLERK 123 3000
SH_CLERK 121 3675
PU_CLERK 114 2780
SA_MAN 100 12200
MK_REP 201 6000
110 AC_ACCOUNT 8300
90 AD_VP 17000
50 ST_CLERK 2785
80 SA_REP 8396.55172
50 ST_MAN 7280
80 SA_MAN 12200
110 AC_MGR 12000
90 AD_PRES 24000
60 IT_PROG 5760
100 FI_MGR 12000
DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
------------- ---------- ---------- -----------
30 PU_CLERK 2780
50 SH_CLERK 3215
20 MK_MAN 13000
100 FI_ACCOUNT 7920
SA_REP 7000
70 PR_REP 10000
30 PU_MAN 11000
10 AD_ASST 4400
20 MK_REP 6000
40 HR_REP 6500
52 rows selected.
q2(UNION ALL):
- SELECT NULL department_id, job_id, manager_id, AVG (salary)
- FROM employees
- GROUP BY (job_id, manager_id)
- UNION ALL
- SELECT department_id, job_id, NULL manager_id, AVG (salary)
- FROM employees
- GROUP BY (department_id, job_id);
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- SH_CLERK 122 3200
- AC_MGR 101 12000
- ST_MAN 100 7280
- ST_CLERK 121 2675
- SA_REP 148 8650
- SH_CLERK 120 2900
- SH_CLERK 124 2825
- MK_MAN 100 13000
- AD_PRES 24000
- FI_MGR 101 12000
- SA_REP 146 8500
- SH_CLERK 123 3475
- AD_ASST 101 4400
- IT_PROG 102 9000
- IT_PROG 103 4950
- FI_ACCOUNT 108 7920
- PU_MAN 100 11000
- ST_CLERK 122 2700
- SA_REP 145 8500
- AC_ACCOUNT 205 8300
- AD_VP 100 17000
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- ST_CLERK 120 2625
- ST_CLERK 124 2925
- SA_REP 147 7766.66667
- SA_REP 149 8333.33333
- HR_REP 101 6500
- PR_REP 101 10000
- ST_CLERK 123 3000
- SH_CLERK 121 3675
- PU_CLERK 114 2780
- SA_MAN 100 12200
- MK_REP 201 6000
- 110 AC_ACCOUNT 8300
- 90 AD_VP 17000
- 50 ST_CLERK 2785
- 80 SA_REP 8396.55172
- 50 ST_MAN 7280
- 80 SA_MAN 12200
- 110 AC_MGR 12000
- 90 AD_PRES 24000
- 60 IT_PROG 5760
- 100 FI_MGR 12000
- DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY)
- ------------- ---------- ---------- -----------
- 30 PU_CLERK 2780
- 50 SH_CLERK 3215
- 20 MK_MAN 13000
- 100 FI_ACCOUNT 7920
- SA_REP 7000
- 70 PR_REP 10000
- 30 PU_MAN 11000
- 10 AD_ASST 4400
- 20 MK_REP 6000
- 40 HR_REP 6500
- 52 rows selected.
Oracle PL/SQL之GROUP BY GROUPING SETS的更多相关文章
- Oracle的rollup、cube、grouping sets函数
转载自:https://blog.csdn.net/huang_xw/article/details/6402396 Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollu ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- ORACLE PL/SQL编程之八:把触发器说透
原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...
- [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)
原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用 ...
- ORACLE PL/SQL编程详解(转)
原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...
- ORACLE PL/SQL:触发器
ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...
- group by <grouping sets(...) ><cube(...)>
GROUP BY GROUPING SETS() 后面将还会写学习 with cube, with rollup,以及将它们转换为标准的GROUP BY的子句GROUP SET(), CU ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
- [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...
随机推荐
- Entity Framework Tutorial Basics(43):Download Sample Project
Download Sample Project: Download sample project for basic Entity Framework tutorials. Sample projec ...
- Python基础入门-函数实战登录功能
''' 函数实战: .加法计算器 .过滤器 .登录功能实战 ''' def add(a,b): return a+b def login_order(): return 'asdfasdfdasfad ...
- DataTable与结构不同实体类之间的转换
在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了.的 ...
- LibreOJ 6279 数列分块入门 3(分块+排序)
题解:自然是先分一波块,把同一个块中的所有数字压到一个vector中,将每一个vector进行排序.然后对于每一次区间加,不完整的块加好后暴力重构,完整的块直接修改标记.查询时不完整的块暴力找最接近x ...
- Transaction And Lock--快照事务隔离级别
--================================================--准备数据GOCREATE DATABASE DB5GOUSE DB5GOCREATE TABLE ...
- webapi put 请求405问题
put 请求的时候 浏览器会像服务器发送两个请求 如何没做任何配置第一个options请求是会报错的 这是需要配置路由给options作响应 这时options请求就通过了,然后你们会看到你的put ...
- C#多线程编程实战1.4终止线程
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- c++类 初始化另一对象
Cbox类中对象a 可以直接赋值给对象b,无论类中数据成员是私有还是共有.且在创建a时调用了一次构造函数,b调用的是另外的默认构造函数: #include<iostream> using ...
- day2学python 数据类型+深浅拷贝+循环
数据类型+深浅拷贝+循环 别的语言的数组 python不用定义 直接使用 color=['红','橙','黄','绿','青','蓝','紫'] print(color[1:3]) //打印[1,3) ...
- day08.2-ssh远程连接服务
在Linux环境中,部署一个服务的一般步骤: a). 准备环境,包括 关闭防火墙:service iptables stop(或chkconfig iptables off) 关闭se ...