转:GROUPING SETS、ROLLUP、CUBE
转: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的使用方法,请看下面的例子
- GROUP BY GROUPING SETS (A,B,C) 等价与 GROUP BY A
- UNION ALL
- GROUP BY B
- UNION ALL
- GROUP BY C
从字面上理解,GROUPING SETS就是GROUP集合的意思,确实是这样的,从上面的例子,我们可以很容易的理解GROUPING SETS的使用方法,但是使用括号的时候需要我们特别注意,请看下面的例子
- GROUP BY GROUPING SETS ((A,B,C)) 等价与 GROUP BY A,B,C
- GROUP BY GROUPING SETS (A,(B,C)) 等价与 GROUP BY A
- UNION ALL
- 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,如下:
- GROUP BY GROUPING SETS (A) 等价于 GROUP BY A,B,C
- ,GROUPING SETS (B)
- ,GROUPING SETS (C)
- GROUP BY GROUPING SETS (A) 等价于 GROUP BY A,B,C
- ,GROUPING SETS ((B,C))
- GROUP BY GROUPING SETS (A) 等价于 GROUP BY A,B
- ,GROUPING SETS (B,C) UNION ALL
- GROUP BY A,C
我们还可以混合使用,如下:
- GROUP BY A 等价于 GROUP BY A
- ,B ,B
- ,GROUPING SETS ((B,C)) ,C
- GROUP BY A 等价于 GROUP BY A,B,C
- ,B UNION ALL
- ,GROUPING SETS (B,C) GROUP BY A,B
- GROUP BY A 等价于 GROUP BY A,B,C
- ,B UNION ALL
- ,C GROUP BY A,B,C
- ,GROUPING SETS (B,C)
请特别注意上面的第3条语句。
下面我们介绍一下ROLLUP和CUBE关键字,它们的使用方式类似,作用也类似,都是用来为GROUP BY语句返回的结果添加汇总信息,也可以说,它们是对分组结果进行二次分组。下面我们看一个简单的例子,如下:
- SELECT
- DEPT AS 部门,
- SEX AS 性别,
- AVG(SALARY) AS 平均工资
- FROM
- (
- --姓名 性别 部门 工资
- VALUES
- ('张三','男','市场部',4000),
- ('赵红','男','技术部',2000),
- ('李四','男','市场部',5000),
- ('李白','女','技术部',5000),
- ('王五','女','市场部',3000),
- ('王蓝','女','技术部',4000)
- ) AS EMPLOY(NAME,SEX,DEPT,SALARY)
- GROUP BY ROLLUP(DEPT,SEX)
- ORDER BY 部门,性别
- 查询结果:
- 部门 性别 平均工资
- 市场部 女 3000
- 市场部 男 4500
- 市场部 NULL 4000
- 技术部 女 4500
- 技术部 男 2000
- 技术部 NULL 3666
- NULL NULL 3833
值得注意的是,上面的ROLLUP语句中,部门(DEPT)和性别(SEX)的顺序非常重要,如果我们互换一下它两的顺序,将得到不同的结果,如下:
- SELECT
- SEX AS 性别,
- DEPT AS 部门,
- AVG(SALARY) AS 平均工资
- FROM
- (
- --姓名 性别 部门 工资
- VALUES
- ('张三','男','市场部',4000),
- ('赵红','男','技术部',2000),
- ('李四','男','市场部',5000),
- ('李白','女','技术部',5000),
- ('王五','女','市场部',3000),
- ('王蓝','女','技术部',4000)
- ) AS EMPLOY(NAME,SEX,DEPT,SALARY)
- GROUP BY ROLLUP(SEX,DEPT)
- ORDER BY 性别,部门
- 查询结果:
- 性别 部门 平均工资
- 女 市场部 3000
- 女 技术部 4500
- 女 NULL 4000
- 男 市场部 4500
- 男 技术部 2000
- 男 NULL 3666
- NULL NULL 3833
CUBE语句比ROLLUP语句返回更多的内容,以下是将上面语句的ROLLUP替换为CUBE后得到的结果:
- SELECT
- DEPT AS 部门,
- SEX AS 性别,
- AVG(SALARY) AS 平均工资
- FROM
- (
- --姓名 性别 部门 工资
- VALUES
- ('张三','男','市场部',4000),
- ('赵红','男','技术部',2000),
- ('李四','男','市场部',5000),
- ('李白','女','技术部',5000),
- ('王五','女','市场部',3000),
- ('王蓝','女','技术部',4000)
- ) AS EMPLOY(NAME,SEX,DEPT,SALARY)
- GROUP BY CUBE(DEPT,SEX)
- ORDER BY 部门,性别
- 查询结果:
- 部门 性别 平均工资
- 市场部 女 3000
- 市场部 男 4500
- 市场部 NULL 4000
- 技术部 女 4500
- 技术部 男 2000
- 技术部 NULL 3666
- NULL 女 4000
- NULL 男 3666
- NULL NULL 3833
如果我们替换CUBE语句中部门(DEPT)和性别(SEX)的顺序,我们将会得到相同的结果
转:GROUPING SETS、ROLLUP、CUBE的更多相关文章
- SQL GROUP BY GROUPING SETS,ROLLUP,CUBE(需求举例)
实现按照不同级别分组统计 关于GROUP BY 中的GROUPING SETS,ROLLUP,CUBE 从需求的角度理解会更加容易些. 需求举例: 假如一所学校只有两个系, 每个系有两个专业, 每个专 ...
- GROUPING SETS、CUBE、ROLLUP
其实还是写一个Demo 比较好 USE tempdb IF OBJECT_ID( 'dbo.T1' , 'U' )IS NOT NULL BEGIN DROP TABLE dbo.T1; END; G ...
- Hive函数:GROUPING SETS,GROUPING__ID,CUBE,ROLLUP
参考:lxw大数据田地:http://lxw1234.com/archives/2015/04/193.htm 数据准备: CREATE EXTERNAL TABLE test_data ( mont ...
- Hive高级聚合GROUPING SETS,ROLLUP以及CUBE
scala> import org.apache.spark.sql.hive.HiveContextimport org.apache.spark.sql.hive.HiveContext s ...
- Hive高阶聚合函数 GROUPING SETS、Cube、Rollup
-- GROUPING SETS作为GROUP BY的子句,允许开发人员在GROUP BY语句后面指定多个统计选项,可以简单理解为多条group by语句通过union all把查询结果聚合起来结合起 ...
- SQL Server2008 程序设计 汇总 GROUP BY,WITH ROLLUP,WITH CUBE,GROUPING SETS(..)
--SQL Server2008 程序设计 汇总 GROUP BY ,WITH ROLLUP WITH CUBE GROUPING SET(..) /*********************** ...
- Hive学习之路 (十七)Hive分析窗口函数(五) GROUPING SETS、GROUPING__ID、CUBE和ROLLUP
概述 GROUPING SETS,GROUPING__ID,CUBE,ROLLUP 这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时.天.月的UV数. ...
- TSQL 分组集(Grouping Sets)
分组集(Grouping Sets)是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用“union all”,计算多个结果集的并集.使用分组集的聚合查询,返回 ...
- Hive SQL grouping sets 用法
概述 GROUPING SETS,GROUPING__ID,CUBE,ROLLUP 这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时.天.月的UV数. ...
随机推荐
- Hadoop笔记HDFS(1)
环境:Hadoop2.7.3 1.Benchmarking HDFS 1.1测试集群的写入 运行基准测试是检测HDFS集群是否正确安装以及表现是否符合预期的好方法.DFSIO是Hadoop自带的一个基 ...
- [问题2014S09] 复旦高等代数II(13级)每周一题(第九教学周)
[问题2014S09] 证明: \(n\) 阶方阵 \(A\) 与所有的 \(A^m\,(m\geq 1)\) 都相似的充分必要条件是 \(A\) 的 Jordan 标准型为 \[\mathrm{d ...
- Python3基础 print 查看一个列表中存储的所有内容
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- Oracle的使用
启动: 1.win+R ---> cmd -----> sqlplus "/as sysdba" //以sysdba身份登录(此时可以创建用户,分配权限等) win ...
- Key Figure中的Aggregation决定了DSO/CUBE转换规则中的Aggregation合计方式
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 【树莓派】基于TinyProxy搭建HTTP代理服务器
一.前言 关于为什么要玩玩HTTP代理就不用我多说了. 二.搭建环境 * Linux laptop 2.6.32-45-generic #100-Ubuntu SMP Wed Nov 14 10:4 ...
- Android ListView简单实用
layout创建: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ ...
- android 待机流程
以下分析基于android2.2的google源码. 开机启动时,首先执行PhoneWindowManager.systemReady()(这之前的流程不分析).调用KeyguardViewMed ...
- Redis的安装与部署
为了解决公司产品数据增长过快,初始化太耗费时间的问题,决定使用redis作为缓存服务器. Windows下的安装与部署: 可以直接参考这个文章,我也是实验了一遍:http://www.runoob.c ...
- Android 利用SurfaceView进行图形绘制
SurfaceView使用介绍 SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作. 要使用SurfaceView进行绘制,步骤如下: 1.用SurfaceView ...