大家对GROUP BY应该比较熟悉,如果你感觉自己并不完全理解GROUP BY,那么本文不适合你。还记得当初学习SQL的时候,总是理解不了GROUP BY的作用,经过好长时间才终于明白GROUP BY的真谛。当然,这和我本人笨也有关系,但是GROUP BY的确不好理解。本文将介绍DB2 GROUPING SETS、ROLLUP、CUBE的使用方法,这些关键字比GROUP BY更难理解,所以阅读本文的时候,一定要慢,仔细的分析,你理解的越多,需要记忆的就越少。

我们首先来看GROUPING SETS的使用方法,请看下面的例子

  1. GROUP BY GROUPING SETS (A,B,C)  等价与  GROUP BY A
  2. UNION ALL
  3. GROUP BY B
  4. UNION ALL
  5. GROUP BY C

从字面上理解,GROUPING SETS就是GROUP集合的意思,确实是这样的,从上面的例子,我们可以很容易的理解GROUPING SETS的使用方法,但是使用括号的时候需要我们特别注意,请看下面的例子

  1. GROUP BY GROUPING SETS ((A,B,C))  等价与  GROUP BY A,B,C
  2. GROUP BY GROUPING SETS (A,(B,C))  等价与  GROUP BY A
  3. UNION ALL
  4. GROUP BY B,C

我们应该把括号里面的所有内容看做一个整体,这个整体必须在同一个GROUP BY语句中,例如,语句2中的B,C在括号中,B,C必须在同一个GROUP BY语句中,千万别把他们拆开,写出GROUP BY B UNION ALL GROUP BY C,那样就大错特错了。

我们还可以在一个GROUP BY语句中多次使用GROUPING SETS,如下:

  1. GROUP BY GROUPING SETS (A)  等价于  GROUP BY A,B,C
  2. ,GROUPING SETS (B)
  3. ,GROUPING SETS (C)
  4. GROUP BY GROUPING SETS (A)  等价于  GROUP BY A,B,C
  5. ,GROUPING SETS ((B,C))
  6. GROUP BY GROUPING SETS (A)  等价于  GROUP BY A,B
  7. ,GROUPING SETS (B,C)        UNION ALL
  8. GROUP BY A,C

我们还可以混合使用,如下:

  1. GROUP BY A                     等价于  GROUP BY A
  2. ,B                                     ,B
  3. ,GROUPING SETS ((B,C))                 ,C
  4. GROUP BY A                    等价于  GROUP BY A,B,C
  5. ,B                            UNION ALL
  6. ,GROUPING SETS (B,C)          GROUP BY A,B
  7. GROUP BY A                    等价于 GROUP BY A,B,C
  8. ,B                           UNION ALL
  9. ,C                           GROUP BY A,B,C
  10. ,GROUPING SETS (B,C)

请特别注意上面的第3条语句。

下面我们介绍一下ROLLUP和CUBE关键字,它们的使用方式类似,作用也类似,都是用来为GROUP BY语句返回的结果添加汇总信息,也可以说,它们是对分组结果进行二次分组。下面我们看一个简单的例子,如下:

  1. SELECT
  2. DEPT   AS 部门,
  3. SEX    AS 性别,
  4. AVG(SALARY) AS 平均工资
  5. FROM
  6. (
  7. --姓名  性别  部门  工资
  8. VALUES
  9. ('张三','男','市场部',4000),
  10. ('赵红','男','技术部',2000),
  11. ('李四','男','市场部',5000),
  12. ('李白','女','技术部',5000),
  13. ('王五','女','市场部',3000),
  14. ('王蓝','女','技术部',4000)
  15. ) AS EMPLOY(NAME,SEX,DEPT,SALARY)
  16. GROUP BY ROLLUP(DEPT,SEX)
  17. ORDER BY 部门,性别
  18. 查询结果:
  19. 部门          性别        平均工资
  20. 市场部         女          3000
  21. 市场部         男          4500
  22. 市场部         NULL        4000
  23. 技术部         女          4500
  24. 技术部         男          2000
  25. 技术部         NULL        3666
  26. NULL           NULL        3833

值得注意的是,上面的ROLLUP语句中,部门(DEPT)和性别(SEX)的顺序非常重要,如果我们互换一下它两的顺序,将得到不同的结果,如下:

  1. SELECT
  2. SEX    AS 性别,
  3. DEPT   AS 部门,
  4. AVG(SALARY) AS 平均工资
  5. FROM
  6. (
  7. --姓名  性别  部门  工资
  8. VALUES
  9. ('张三','男','市场部',4000),
  10. ('赵红','男','技术部',2000),
  11. ('李四','男','市场部',5000),
  12. ('李白','女','技术部',5000),
  13. ('王五','女','市场部',3000),
  14. ('王蓝','女','技术部',4000)
  15. ) AS EMPLOY(NAME,SEX,DEPT,SALARY)
  16. GROUP BY ROLLUP(SEX,DEPT)
  17. ORDER BY 性别,部门
  18. 查询结果:
  19. 性别         部门         平均工资
  20. 女         市场部         3000
  21. 女         技术部         4500
  22. 女         NULL           4000
  23. 男         市场部         4500
  24. 男         技术部         2000
  25. 男         NULL           3666
  26. NULL       NULL           3833

CUBE语句比ROLLUP语句返回更多的内容,以下是将上面语句的ROLLUP替换为CUBE后得到的结果:

  1. SELECT
  2. DEPT   AS 部门,
  3. SEX    AS 性别,
  4. AVG(SALARY) AS 平均工资
  5. FROM
  6. (
  7. --姓名  性别  部门  工资
  8. VALUES
  9. ('张三','男','市场部',4000),
  10. ('赵红','男','技术部',2000),
  11. ('李四','男','市场部',5000),
  12. ('李白','女','技术部',5000),
  13. ('王五','女','市场部',3000),
  14. ('王蓝','女','技术部',4000)
  15. ) AS EMPLOY(NAME,SEX,DEPT,SALARY)
  16. GROUP BY CUBE(DEPT,SEX)
  17. ORDER BY 部门,性别
  18. 查询结果:
  19. 部门         性别         平均工资
  20. 市场部         女         3000
  21. 市场部         男         4500
  22. 市场部         NULL       4000
  23. 技术部         女         4500
  24. 技术部         男         2000
  25. 技术部         NULL       3666
  26. NULL           女         4000
  27. NULL           男         3666
  28. NULL           NULL       3833

如果我们替换CUBE语句中部门(DEPT)和性别(SEX)的顺序,我们将会得到相同的结果。

----更多参见:DB2 SQL 精萃

----声明:转载请注明出处。

----last updated on 2010.1.15

----written by ShangBo on 2010.1.15

----end

GROUPING SETS、ROLLUP、CUBE的更多相关文章

  1. 转:GROUPING SETS、ROLLUP、CUBE

    转:http://blog.csdn.net/shangboerds/article/details/5193211 大家对GROUP BY应该比较熟悉,如果你感觉自己并不完全理解GROUP BY,那 ...

  2. SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE

    1.创建表 Staff CREATE TABLE [dbo].[Staff]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Money] [int] NULL, [Cr ...

  3. (2.4)DDL增强功能-数据汇总grouping、rollup、cube

    参考:https://www.cnblogs.com/nikyxxx/archive/2012/11/27/2791001.html 1.rollup (1)rollup在group by 子句中使用 ...

  4. Group By 多个分组集小结 --GROUPING SETS,GROUP BY CUBE,GROUP BY ROLLUP,GROUPING(),GROUPING_ID()

    T-SQL 多个分组集共有三种 GROUPING SETS, CUBE, 以及ROLLUP, 其中 CUBE和ROLLUP可以当做是GROUPING SETS的简写版 示例数据库下载: http:// ...

  5. vue、rollup、sass、requirejs组成的vueManager

    近段时间本人一直在思考如何基于vue搭建一个中后端管理系统的通用基础前端解决方案.思考的主要问题点如下: 如何使各个子业务模块的按需加载 css预处理方案的选择 如何引入现代的前端工程思想,也就是工程 ...

  6. SQL 中GROUP BY 、ROLLUP、CUBE 关系和区别

    转自:http://www.cnblogs.com/dyufei/archive/2009/11/12/2573974.html 不言自明,看SQL就完全理解了,不需要过多解释,不错,分享之: ROL ...

  7. SQLSERVER中的ALL、PERCENT、CUBE关键字、ROLLUP关键字和GROUPING函数

    SQLSERVER中的ALL.PERCENT.CUBE关键字.ROLLUP关键字和GROUPING函数 先来创建一个测试表 USE [tempdb] GO )) GO INSERT INTO [#te ...

  8. Grouping Sets:CUBE和ROLLUP从句

    在上一篇文章里我讨论了SQL Server里Grouping Sets的功能.从文中的例子可以看到,通过简单定义需要的分组集是很容易进行各自分组.但如果像从所给的列集里想要有所有可能的分布——即所谓的 ...

  9. TSQL 分组集(Grouping Sets)

    分组集(Grouping Sets)是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用“union all”,计算多个结果集的并集.使用分组集的聚合查询,返回 ...

随机推荐

  1. 重拾CSS基础—开篇

    由来 从事软件行业一晃也5年有余,之间参与过若干个基于web的项目,所以javascript和Html基本已经相当熟悉,最近对于web前端开发比较关注,分析后发现CSS的确是自己的弱项,于是决定再加强 ...

  2. uber奖励和账单详解

    为了让各位车主轻松理解奖励政策和账单明细的核算方法,我们特意制作#奖励详解#的专题文章,保证您五分钟内掌握看懂账单的全部要领和诀窍. 第一部分:收入说明 看到收入说明的账单是不是有些晕呢,来来,我们一 ...

  3. HDU 4633 Who's Aunt Zhang (Polya定理+快速幂)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4633 典型的Polya定理: 思路:根据Burnside引理,等价类个数等于所有的置换群中的不动点的个 ...

  4. [置顶] Ajax 初步学习总结

    Ajax是什么 Ajax是(Asynchronous JavaScript And XML)是异步的JavaScript和xml.也就是异步请求更新技术.Ajax是一种对现有技术的一种新的应用,不是一 ...

  5. OpenGL 4 : 一个漂亮的心 For you, My Love

    画一个心形有非常多公式能够使用,以下这个公式我觉得最完美了: float x = R * 16 * pow(sin(theta), 3); float y = R * (13 * cos(theta) ...

  6. sublime编辑器怎样高速输入PHP头部版本号声明

    Sublime 菜单条->Tools→New Snippet→得到例如以下图内容: 输入下面内容: <snippet> <content><![CDATA[ < ...

  7. linux下curl编程

    LibCurl是免费的客户端URL传输库,支持FTP,FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE ,LDAP等协议,其主页是http: ...

  8. 简明的例子讲解position:relative、float、overflow:hidden和inline-block

    标签(空格分隔): css relative float 我们通过一个简单的实验来了解position:relative float overflow:hidden 和 inline-block. 下 ...

  9. maven安装scala插件

    默认情况maven不支持scala 所以需要安装maven-scala插件 更新地址:http://alchim31.free.fr/m2e-scala/update-site/ (m2eclipse ...

  10. Myeclipse利用maven构建sping web项目

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQQAAADvCAIAAACbnj2oAAAfq0lEQVR4nO2d+1MUV9rH+294U9mqpG ...