[转自] 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):

  1. SELECT   department_id, job_id, manager_id, AVG (salary)
  2. FROM employees
  3. GROUP BY GROUPING SETS ((department_id, job_id), (job_id, manager_id));
  4. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
  5. ------------- ---------- ---------- -----------
  6. SH_CLERK          122        3200
  7. AC_MGR            101       12000
  8. ST_MAN            100        7280
  9. ST_CLERK          121        2675
  10. SA_REP            148        8650
  11. SH_CLERK          120        2900
  12. SH_CLERK          124        2825
  13. MK_MAN            100       13000
  14. AD_PRES                     24000
  15. FI_MGR            101       12000
  16. SA_REP            146        8500
  17. SH_CLERK          123        3475
  18. AD_ASST           101        4400
  19. IT_PROG           102        9000
  20. IT_PROG           103        4950
  21. FI_ACCOUNT        108        7920
  22. PU_MAN            100       11000
  23. ST_CLERK          122        2700
  24. SA_REP            145        8500
  25. AC_ACCOUNT        205        8300
  26. AD_VP             100       17000
  27. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
  28. ------------- ---------- ---------- -----------
  29. ST_CLERK          120        2625
  30. ST_CLERK          124        2925
  31. SA_REP            147  7766.66667
  32. SA_REP            149  8333.33333
  33. HR_REP            101        6500
  34. PR_REP            101       10000
  35. ST_CLERK          123        3000
  36. SH_CLERK          121        3675
  37. PU_CLERK          114        2780
  38. SA_MAN            100       12200
  39. MK_REP            201        6000
  40. 110 AC_ACCOUNT                   8300
  41. 90 AD_VP                       17000
  42. 50 ST_CLERK                     2785
  43. 80 SA_REP                 8396.55172
  44. 50 ST_MAN                       7280
  45. 80 SA_MAN                      12200
  46. 110 AC_MGR                      12000
  47. 90 AD_PRES                     24000
  48. 60 IT_PROG                      5760
  49. 100 FI_MGR                      12000
  50. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
  51. ------------- ---------- ---------- -----------
  52. 30 PU_CLERK                     2780
  53. 50 SH_CLERK                     3215
  54. 20 MK_MAN                      13000
  55. 100 FI_ACCOUNT                   7920
  56. SA_REP                       7000
  57. 70 PR_REP                      10000
  58. 30 PU_MAN                      11000
  59. 10 AD_ASST                      4400
  60. 20 MK_REP                       6000
  61. 40 HR_REP                       6500
  62. 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):

  1. SELECT   NULL department_id, job_id, manager_id, AVG (salary)
  2. FROM employees
  3. GROUP BY (job_id, manager_id)
  4. UNION ALL
  5. SELECT   department_id, job_id, NULL manager_id, AVG (salary)
  6. FROM employees
  7. GROUP BY (department_id, job_id);
  8. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
  9. ------------- ---------- ---------- -----------
  10. SH_CLERK          122        3200
  11. AC_MGR            101       12000
  12. ST_MAN            100        7280
  13. ST_CLERK          121        2675
  14. SA_REP            148        8650
  15. SH_CLERK          120        2900
  16. SH_CLERK          124        2825
  17. MK_MAN            100       13000
  18. AD_PRES                     24000
  19. FI_MGR            101       12000
  20. SA_REP            146        8500
  21. SH_CLERK          123        3475
  22. AD_ASST           101        4400
  23. IT_PROG           102        9000
  24. IT_PROG           103        4950
  25. FI_ACCOUNT        108        7920
  26. PU_MAN            100       11000
  27. ST_CLERK          122        2700
  28. SA_REP            145        8500
  29. AC_ACCOUNT        205        8300
  30. AD_VP             100       17000
  31. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
  32. ------------- ---------- ---------- -----------
  33. ST_CLERK          120        2625
  34. ST_CLERK          124        2925
  35. SA_REP            147  7766.66667
  36. SA_REP            149  8333.33333
  37. HR_REP            101        6500
  38. PR_REP            101       10000
  39. ST_CLERK          123        3000
  40. SH_CLERK          121        3675
  41. PU_CLERK          114        2780
  42. SA_MAN            100       12200
  43. MK_REP            201        6000
  44. 110 AC_ACCOUNT                   8300
  45. 90 AD_VP                       17000
  46. 50 ST_CLERK                     2785
  47. 80 SA_REP                 8396.55172
  48. 50 ST_MAN                       7280
  49. 80 SA_MAN                      12200
  50. 110 AC_MGR                      12000
  51. 90 AD_PRES                     24000
  52. 60 IT_PROG                      5760
  53. 100 FI_MGR                      12000
  54. DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
  55. ------------- ---------- ---------- -----------
  56. 30 PU_CLERK                     2780
  57. 50 SH_CLERK                     3215
  58. 20 MK_MAN                      13000
  59. 100 FI_ACCOUNT                   7920
  60. SA_REP                       7000
  61. 70 PR_REP                      10000
  62. 30 PU_MAN                      11000
  63. 10 AD_ASST                      4400
  64. 20 MK_REP                       6000
  65. 40 HR_REP                       6500
  66. 52 rows selected.

Oracle PL/SQL之GROUP BY GROUPING SETS的更多相关文章

  1. Oracle的rollup、cube、grouping sets函数

    转载自:https://blog.csdn.net/huang_xw/article/details/6402396 Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollu ...

  2. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  3. ORACLE PL/SQL编程之八:把触发器说透

    原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...

  4. [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)

    原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用 ...

  5. ORACLE PL/SQL编程详解(转)

    原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...

  6. ORACLE PL/SQL:触发器

    ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...

  7. group by <grouping sets(...) ><cube(...)>

    GROUP BY      GROUPING SETS() 后面将还会写学习 with cube,  with rollup,以及将它们转换为标准的GROUP BY的子句GROUP SET(), CU ...

  8. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  9. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

随机推荐

  1. pandas sort_values 排序后, index 也发生了改变,不改变的情况下需要 reset_index(drop = True)

    shenpi.sort_values(by=['apply_date'],ascending=True,inplace=True)shenpi.reset_index(drop = True)

  2. HDU 3729 I'm Telling the Truth (二分匹配)

    题意:给定 n 个人成绩排名区间,然后问你最多有多少人成绩是真实的. 析:真是没想到二分匹配,....后来看到,一下子就明白了,原来是水题,二分匹配,只要把每个人和他对应的区间连起来就好,跑一次二分匹 ...

  3. 编写高质量代码改善C#程序的157个建议——建议1:正确操作字符串

    最近拜读了陆敏技老师的<编写高质量代码改善C#程序的157个建议>,感觉不错,决定把笔记整理一遍. 建议1: 正确操作字符串 字符串应该是所有编程语言中使用最频繁的一种基础数据类型.如果使 ...

  4. 十进制--->二进制(利用C++栈功能)

    原创 十进制转二进制很简单,其中用到C++的栈功能就能更加方便! stack<int> s; //栈的定义,s已经被定义为一个栈 s.push(); //将20入栈 s.push(); s ...

  5. 国内物联网平台(8):中移物联网开放平台OneNet

    国内物联网平台(8)——中移物联网开放平台OneNet 马智 平台定位 OneNET是中移物联网有限公司搭建的开放.共赢设备云平台,为各种跨平台物联网应用.行业解决方案,提供简便的云端接入.存储.计算 ...

  6. HackThirteen 在onCreate()方法中获取View的宽度和高度

    1.概要:     Android源代码中很多模块都使用了post()方法,深入理解框架曾运行机制对于避开类似于本例中的小陷阱是很重要的 2.问题提出:     如果开发一些依赖于UI控件的宽和高的功 ...

  7. 小规模kvm宿主机管理-webvirtmgr安装

    1.前言WebVirtMgr是近两年来发展较快,比较活跃,非常清新的一个KVM管理平台,提供对宿主机和虚机的统一管理,它有别于kvm自带的图形管理工具(virtual machine manager) ...

  8. c编译错误[Error] ld returned 1 exit status 解决

    [Error] ld returned exit status 编译的过程中出现这个错误极有可能是因为函数名错误引起的,因此回到源码中观察函数名,尤其是那些库函数中的函数.

  9. centos6.3安装 jdk-8u131-linux-x64.gz

    解压指令为:tar -zxvf jdk-8u131-linux-x64.gz 设置环境变量,首先是打开设置环境变量的文件夹,指令为:vi /etc/profile     然后在英文输入法下切换到“插 ...

  10. C语言实现数组及链表的快速排序

    1. 数组快排: 方法一: #include <stdio.h> #include <stdlib.h> //交换 void swap(int *pi, int *pj) { ...