转: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数. ...
随机推荐
- nginx 配置文件备份
1. /etc/nginx/sites-enabled/default 的原始文件 # You may add here your # server { # ... # } # statements ...
- R----stringr包介绍学习
1. stringr介绍 stringr包被定义为一致的.简单易用的字符串工具集.所有的函数和参数定义都具有一致性,比如,用相同的方法进行NA处理和0长度的向量处理. 字符串处理虽然不是R语言中最主要 ...
- [问题2014S13] 复旦高等代数II(13级)每周一题(第十三教学周)
[问题2014S13] (1) 设 \(A\) 是数域 \(\mathbb{K}\) 上的 \(n\) 阶非异阵, 若存在主对角元全为 \(1\) 的下三角阵 \(L\in M_n(\mathbb ...
- 安装了ubuntu14.04+windows7双系统的笔记本启动后出现grub rescue>提示符
解决思想如下: 1.在grub rescue>提示符处输入ls 即可看到该命令列出了硬盘上的所有分区,找到安装了linux的分区,我的安装在(hd0,msdos8)下,所以我以(hd0,msd ...
- 用spring的InitializingBean作初始化
org.springframework.beans.factory包下有一个接口是InitializingBean 只有一个方法: /** * Invoked by a BeanFactory af ...
- USACO2016Splitting the Field分割牧场
Description FJ的N头奶牛分别位于他二维的牧场的不同位置.FJ想用一个矩形栅栏围住这些牛(牛可以在栅栏边上),并使这个栅栏尽可能小.这个栅栏的边与x轴或y轴平行.不幸的是,FJ上个季度的牛 ...
- magic_quotes_gpc
ini里面有这个magic_quotes_gpc设置,是为了防止忘记处理而和mysql有冲突,引起mysql的风险,于是,认为的加上\slash,但是我们在Php中获得值的时候,需要判断如果这个值为1 ...
- [原创] WINDOWS 7 精简教程之驱动精简 可用于64和32
追风神话 发表于 2014-9-1 11:35:56 https://www.itsk.com/forum.php?mod=viewthread&tid=334491&highli ...
- The import javax.servlet.http.HttpServletRequest cannot be resolved
Error: The import javax.servlet cannot be resolved The import javax.servlet.http.HttpServletRequest ...
- 工作中使用的html5和css3 新特性
1.placeholder <input type="text" placeholder="请输入手机号码" class="phone" ...