转:http://blog.csdn.net/shangboerds/article/details/5193211

大家对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)的顺序,我们将会得到相同的结果

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

  1. SQL GROUP BY GROUPING SETS,ROLLUP,CUBE(需求举例)

    实现按照不同级别分组统计 关于GROUP BY 中的GROUPING SETS,ROLLUP,CUBE 从需求的角度理解会更加容易些. 需求举例: 假如一所学校只有两个系, 每个系有两个专业, 每个专 ...

  2. GROUPING SETS、CUBE、ROLLUP

    其实还是写一个Demo 比较好 USE tempdb IF OBJECT_ID( 'dbo.T1' , 'U' )IS NOT NULL BEGIN DROP TABLE dbo.T1; END; G ...

  3. Hive函数:GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

    参考:lxw大数据田地:http://lxw1234.com/archives/2015/04/193.htm 数据准备: CREATE EXTERNAL TABLE test_data ( mont ...

  4. Hive高级聚合GROUPING SETS,ROLLUP以及CUBE

    scala> import org.apache.spark.sql.hive.HiveContextimport org.apache.spark.sql.hive.HiveContext s ...

  5. Hive高阶聚合函数 GROUPING SETS、Cube、Rollup

    -- GROUPING SETS作为GROUP BY的子句,允许开发人员在GROUP BY语句后面指定多个统计选项,可以简单理解为多条group by语句通过union all把查询结果聚合起来结合起 ...

  6. SQL Server2008 程序设计 汇总 GROUP BY,WITH ROLLUP,WITH CUBE,GROUPING SETS(..)

    --SQL Server2008 程序设计 汇总 GROUP BY ,WITH ROLLUP  WITH CUBE  GROUPING SET(..) /*********************** ...

  7. Hive学习之路 (十七)Hive分析窗口函数(五) GROUPING SETS、GROUPING__ID、CUBE和ROLLUP

    概述 GROUPING SETS,GROUPING__ID,CUBE,ROLLUP 这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时.天.月的UV数. ...

  8. TSQL 分组集(Grouping Sets)

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

  9. Hive SQL grouping sets 用法

    概述 GROUPING SETS,GROUPING__ID,CUBE,ROLLUP 这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时.天.月的UV数. ...

随机推荐

  1. Hadoop笔记HDFS(1)

    环境:Hadoop2.7.3 1.Benchmarking HDFS 1.1测试集群的写入 运行基准测试是检测HDFS集群是否正确安装以及表现是否符合预期的好方法.DFSIO是Hadoop自带的一个基 ...

  2. [问题2014S09] 复旦高等代数II(13级)每周一题(第九教学周)

    [问题2014S09]  证明: \(n\) 阶方阵 \(A\) 与所有的 \(A^m\,(m\geq 1)\) 都相似的充分必要条件是 \(A\) 的 Jordan 标准型为 \[\mathrm{d ...

  3. Python3基础 print 查看一个列表中存储的所有内容

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  4. Oracle的使用

    启动: 1.win+R ---> cmd  -----> sqlplus "/as sysdba"  //以sysdba身份登录(此时可以创建用户,分配权限等) win ...

  5. Key Figure中的Aggregation决定了DSO/CUBE转换规则中的Aggregation合计方式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. 【树莓派】基于TinyProxy搭建HTTP代理服务器

    一.前言 关于为什么要玩玩HTTP代理就不用我多说了.  二.搭建环境 * Linux laptop 2.6.32-45-generic #100-Ubuntu SMP Wed Nov 14 10:4 ...

  7. Android ListView简单实用

    layout创建: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ ...

  8. android 待机流程

    以下分析基于android2.2的google源码.  开机启动时,首先执行PhoneWindowManager.systemReady()(这之前的流程不分析).调用KeyguardViewMed ...

  9. Redis的安装与部署

    为了解决公司产品数据增长过快,初始化太耗费时间的问题,决定使用redis作为缓存服务器. Windows下的安装与部署: 可以直接参考这个文章,我也是实验了一遍:http://www.runoob.c ...

  10. Android 利用SurfaceView进行图形绘制

    SurfaceView使用介绍 SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作. 要使用SurfaceView进行绘制,步骤如下: 1.用SurfaceView ...