grouping sets主要是用来合并多个分组的结果。

对于员工目标业绩表‘businessTarget’:

employeeId    targetDate    idealDistAmount
10098 2016-05 100000
10099 2016-05 80000
10100 2016-05 80000
10101 2016-05 100000
10102 2016-05 50000
10103 2016-05 50000
10104 2016-05 50000
10118 2016-05 50000
10130 2016-05 507689
10091 2016-07 20000
10290 2016-08 20000
10291 2016-08 20000
9058 2016-08 10000
9792 2016-07 20000
9865 2016-07 20000

如果需要分别对上表employeeId,targetDate,(employeeId,targetDate)分别进行group by,代码如下:

 select  employeeId,null,sum(idealDistAmount)
from businessTarget
group by employeeId
union all
select null,targetDate,sum(idealDistAmount)
from businessTarget
group by targetDate
union all
select employeeId,targetDate,sum(idealDistAmount)
from businessTarget
group by employeeId,targetDate

结果:

 employeeId    (无列名)    (无列名)
9058 NULL 10000
9792 NULL 20000
9865 NULL 20000
10091 NULL 20000
10098 NULL 100000
10099 NULL 80000
10100 NULL 80000
10101 NULL 100000
10102 NULL 50000
10103 NULL 50000
10104 NULL 50000
10118 NULL 50000
10130 NULL 507689
10290 NULL 20000
10291 NULL 20000
NULL 2016-05 1067689
NULL 2016-07 60000
NULL 2016-08 50000
10098 2016-05 100000
10099 2016-05 80000
10100 2016-05 80000
10101 2016-05 100000
10102 2016-05 50000
10103 2016-05 50000
10104 2016-05 50000
10118 2016-05 50000
10130 2016-05 507689
9792 2016-07 20000
9865 2016-07 20000
10091 2016-07 20000
9058 2016-08 10000
10290 2016-08 20000
10291 2016-08 20000

如果我们运用grouping sets来指定多个group by 选项,

就可以通过一条select 语句实现复杂繁琐的多条select 语句的查询,并且更加的高效。
 select  employeeId,targetDate,sum(idealDistAmount)
from businessTarget
group by
grouping sets
(
(employeeId),
(targetDate),
(employeeId,targetDate),()
)

结果:

 employeeId    targetDate    (无列名)
10098 2016-05 100000
10099 2016-05 80000
10100 2016-05 80000
10101 2016-05 100000
10102 2016-05 50000
10103 2016-05 50000
10104 2016-05 50000
10118 2016-05 50000
10130 2016-05 507689
NULL 2016-05 1067689
9792 2016-07 20000
9865 2016-07 20000
10091 2016-07 20000
NULL 2016-07 60000
9058 2016-08 10000
10290 2016-08 20000
10291 2016-08 20000
NULL 2016-08 50000
NULL NULL 1177689
9058 NULL 10000
9792 NULL 20000
9865 NULL 20000
10091 NULL 20000
10098 NULL 100000
10099 NULL 80000
10100 NULL 80000
10101 NULL 100000
10102 NULL 50000
10103 NULL 50000
10104 NULL 50000
10118 NULL 50000
10130 NULL 507689
10290 NULL 20000
10291 NULL 20000

除了grouping sets从属子句,我们还可以运用另外一个从属子句同样可以得到这样的结果,

那就是cube从属子句,代码如下:

 select  employeeId,targetDate,sum(idealDistAmount)
from businessTarget
group by
cube(employeeId,targetDate)--等同于grouping sets((employeeId),(targetDate),(employeeId,targetDate),())
order by employeeId

此三种方法运行得到的结果是一样的。

grouping sets从属子句的运用的更多相关文章

  1. TSQL 分组集(Grouping Sets)

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

  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. Grouping Sets:CUBE和ROLLUP从句

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

  4. SQL Server里Grouping Sets的威力

    在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务).我不是说在生产里使用开发版,也不是说安装盗版SQL Server. 不可能的任务 ...

  5. GROUPING SETS、CUBE、ROLLUP

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

  6. 介绍一种非常好用汇总数据的方式GROUPING SETS

    介绍 对于任何人而言,用T-SQL语句来写聚会查询都是工作中重要的一环.我们大家也都很熟悉GROUP BY子句来实现聚合表达式,但是如果打算在一个结果集中包含多种不同的汇总结果,可能会比较麻烦.我将举 ...

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

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

  8. GROUP BY中ROLLUP/CUBE/GROUPING/GROUPING SETS使用示例

    oracle group by中rollup和cube的区别: Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句.CUBE ROLLUP 是用于统计数据的. 实验 ...

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

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

随机推荐

  1. 学会给你的类(及成员)来定制一套自己的Attribute吧

    在通过Visual Studio创建的C#程序集中,都包含了一个AssemblyInfo.cs的文件,在这个文件中,我们常常会看到这样的代码 [assembly: AssemblyTitle(&quo ...

  2. ASP.NET用QQ,网易发送邮件以及添加附件

    教程:ASP.NET用QQ,网易发送邮件以及添加附件 这是我用QQ邮箱出现的异常: 命令顺序不正确. 服务器响应为:Error: need EHLO and AUTH first !无法从传输连接中读 ...

  3. 运用<div>布局页面练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. dbutils基本使用

    dbutils的查询,主要用到的是query方法,增加,修改和删除都是update方法,update方法就不讲了 只要创建ResultSetHandler接口不同的实现类对象就可以得到想要的查询结果, ...

  5. JVM之上的语言小集

    1 JVM上的编程语言https://en.wikipedia.org/wiki/List_of_JVM_languages主要的有:Clojure, a functional Lisp dialec ...

  6. PyCharm断点调试django

    我在用PyCharm开发django程序的时候,对于打印日志调试程序的方式感觉还是有点麻烦和不直观,所以研究了一下断点调试的方法如下: 1.打开你的工程,在菜单栏里找到Run-->Edit Co ...

  7. Hibernate 系列 03 - 使用Hibernate完成持久化操作

    引导目录: Hibernate 系列教程 目录 康姆昂,北鼻,来此狗.动次打次,Hibernate继续走起. 目录: 使用Hibernate实现按主键查询 使用Hibernate实现数据库的增.删.改 ...

  8. Javascript——arguments的shift问题谈方法“借用”

    今天本来运行了打算这样的方法 arguments.shift() (shift方法是删除数组的第一个元素,例如var arr=[1,2,3,4,5]执行var a=arr.shift();之后,a的值 ...

  9. Spark SQL 之 DataFrame

    Spark SQL 之 DataFrame 转载请注明出处:http://www.cnblogs.com/BYRans/ 概述(Overview) Spark SQL是Spark的一个组件,用于结构化 ...

  10. Oracle学习笔记四 SQL命令(二):SQL操作语言类别

    SQL分为下列语言类别 1.数据定义语言(DDL) Create.Alter.Drop 2.数据操纵语言(DML) Insert.Select.Delete.Update 3.事务控制语言(TCL) ...