分组集(Grouping Sets)是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用“union all”,计算多个结果集的并集。使用分组集的聚合查询,返回的select 子句相同,由于select子句只能引用分组列,因此,在单个分组中缺失的分组列,TSQL返回NULL值。

TSQL使用 group by 子句分组,有4种不同的语法:

  • group by a,b
  • group by rollup(a,b)
  • group by cube(a,b)
  • group by grouping sets((),(a),(a,b),rollup(a,b),cube(a,b))

一,分组集

1,单个分组

以集合的视角来看 “group by a,b” 子句,等价于 “group by grouping sets (a,b)”,(a,b) 是单个分组,是集合相乘的结果:(a)*(b)=(a,b) ;

2,预定义的分组集(grouping sets)

  • rollup(a,b) :预定义的分组集是(),(a),(a,b);
  • cube(a,b) :预定义的的分组集是(),(a),(b),(a,b);

3,使用grouping sets 自定义分组集

单个分组的集合是分组集, 分组集 grouping sets((a),(a,b)) :表示两个分组 (a,b),(a) 的并集,查询的结果等价于:

  1. group by (a,b)
  2. union all
  3. group by(a)

4,分组集运算

分组集运算法则:

  • () :表示空集,整个集合作为一个分组;任何集合和空集相乘,结果是:(a)*()=(a);
  • 分组集相乘:两两组合,例如,{(a),(b)}*{(c),(d)}={(a,c),(a,d),(b,c),(b,d)}
  • 集合相乘时,不会去重:例如,{(a),(b)}*{(),(a)}={(a),(a,a),(b),(b,a)}
  • (a,a)等价于集合(a):例如,{(a),(b)}*{(),(a)}={(a),(a),(b),(b,a)}
  • group by是分组集相乘:例如, group by grouping sets((a),(b)),c 等价于 group by grouping sets((a,c),(b,c))
  • grouping sets是分组集求并集,不会去重:例如,grouping sets((a),(a)) 等价于 grouping sets(a) union all grouping sets(a)

4.1,解析:grouping sets(rollup(a,b),b) 等价于 group by cube(a,b)

解析过程:rollup(a,b)定义的分组集是(),(a),(a,b),并上分组(b),就是:((),(a),(a,b),(b)),等价于cube(a,b)。

4.2,解析 group by grouping sets((a),(b)), rollup(a)

解析过程:grouping sets((a),(b)),定义两个分组集合((a),(b)),rollup(a)定义两个分组集合:((),(a)),

两个分组集进行相乘:{(a),(b)}*{(),(a)}={(a),(a),(b),(b,a)},集合相乘时,不会去重;

二,示例

1,创建示例数据

  1. create table dbo.Inventory
  2. (
  3. Item int not null,
  4. Color varchar(10) not null,
  5. Quantity int not null,
  6. Store int not null
  7. )

2,将整个集合作为一个分组,grouping sets 是()

  1. select null as Item, null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  2. from dbo.Inventory
  3.  
  4. --等价于
  5. select null as Item, null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  6. from dbo.Inventory
  7. group by grouping sets(())

3,grouping sets是(a)

  1. select Item,null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  2. from dbo.Inventory
  3. group by Item
  4. order by Item
  5.  
  6. --等价于
  7. select Item,null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  8. from dbo.Inventory
  9. group by grouping sets( (Item))
  10. order by Item

4,grouping sets 是(a,b)

  1. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  2. from Inventory
  3. group by Item,Color
  4. order by Item,Color
  5.  
  6. --等价于
  7. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  8. from Inventory
  9. group by grouping sets( (Item,Color))
  10. order by Item,Color

5,分组集是:rollup(a,b),或 grouping sets是((),(a),(a,b))

  1. --rollup(a,b)的grouping sets是(),(a),(a,b)
  2. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  3. from dbo.Inventory
  4. group by ROLLUP(Item,Color)
  5. order by Item,Color
  6.  
  7. --等价于
  8. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  9. from dbo.Inventory
  10. group by grouping sets((),(Item),(Item,Color))
  11. order by Item,Color

6,分组集是:cube(a,b),或grouping sets是(),(a),(b),(a,b)

  1. --cube(a,b)的grouping sets是(),(a),(b),(a,b)
  2. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  3. from dbo.Inventory
  4. group by ROLLUP(Item,Color)
  5. order by Item,Color
  6.  
  7. --等价于
  8. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  9. from dbo.Inventory
  10. group by grouping sets((),(Item),(Color),(Item,Color))
  11. order by Item,Color

7,对rollup(a,b),使用单个分组和union来实现

  1. --rollup(a,b)的grouping sets是(),(a),(a,b)
  2. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  3. from dbo.Inventory
  4. group by ROLLUP(Item,Color)
  5. order by Item,Color
  6.  
  7. --等价于
  8. select null as Item, null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  9. from dbo.Inventory
  10.  
  11. union ALL
  12. select Item,null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  13. from dbo.Inventory
  14. group by Item
  15.  
  16. union ALL
  17. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  18. from dbo.Inventory
  19. group by Item,Color

8,对cube(a,b),使用单个分组和union来实现

  1. --cube(a,b)的grouping sets是(),(a),(b),(a,b)
  2. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  3. from dbo.Inventory
  4. group by cube(Item,Color)
  5. order by Item,Color
  6.  
  7. --等价于
  8. select null as Item, null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  9. from dbo.Inventory
  10.  
  11. union ALL
  12. select Item,null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  13. from dbo.Inventory
  14. group by Item
  15.  
  16. union ALL
  17. select null as Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  18. from dbo.Inventory
  19. group by Color
  20. union all
  21. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  22. from dbo.Inventory
  23. group by Item,Color

9, cube(a,b)的等价分组集是:grouping sets(rollup(a,b),b),或grouping sets((),(a),(a,b),(b))

  1. --cube(a,b)的组合是(),(a),(b),(a,b)
  2. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  3. from Inventory
  4. group by CUBE( Item,Color)
  5. order by Item,Color
  6.  
  7. --等价于
  8. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  9. from dbo.Inventory
  10. group by grouping sets((),(Item),(Color),(Item,Color))
  11. order by Item,Color
  12.  
  13. --等价于
  14. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  15. from dbo.Inventory
  16. group by grouping sets(rollup(Item,Color),(Color))
  17. order by Item,Color

10,分组集相乘,结果集不去重

解析 grouping sets((a),(b)), rollup(a)等价于 grouping((a),(a),(b),(b,a))

解析过程是:grouping sets((a),(b)), 定义两个分组集是(a),(b),rollup(a)定义两个分组集是:(),(a)

对这个分组集进行集合乘法运算:{(a),(b)}*{(),(a)}={(a),(a),(b),(b,a)}

  1. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  2. from dbo.Inventory
  3. group by grouping sets((Item),(Color)),rollup(Item)
  4. order by Item,Color
  5.  
  6. --等价于
  7. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  8. from dbo.Inventory
  9. group by grouping sets((Item),(Color),(Item,Item),(Color,Item))
  10. order by Item,Color

解析: grouping sets((a,b)),rollup(a)

解析过程:grouping sets((a,b)),定义分组集(a,b),rollup(a)定义分组集:{(),(a)},对这两个分组集合进行集合乘法运算:(a,b)*{(),(a)}={(a,b),(a,b)},实际上是两个相同的group by grouping sets((a,b)) 进行 union all 运算求并集。

  1. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  2. from dbo.Inventory
  3. group by grouping sets((Item,Color)),rollup(Item)
  4. order by Item,Color
  5.  
  6. --等价于
  7. select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
  8. from dbo.Inventory
  9. group by grouping sets((Item,Color),(Color,Item))
  10. order by Item,Color

三,分组集用法总结

1, cube和rollup 预定义grouping sets,

  • rollup(a,b):预定义的grouping sets是(),(a),(a,b);
  • cube(a,b):预定义的grouping sets是(),(a),(b),(a,b);

2,集合的乘法

group by a,b 表示的是分组集(a),(b)的乘法:(a)*(b)=(a,b)

group by grouping sets((a),(b)),c 表示的是分组集((a),(b)),(c)的乘法:((a),(b))*(c)=((a,c),(b,c))

3,集合的并集

grouping sets((a),(b)),表示的是分组集的并集,等价于:

  1. grouping sets(a)
  2. union all
  3. grouping sets(b)

参考文档:

Using GROUP BY with ROLLUP, CUBE, and GROUPING SETS

GROUP BY (Transact-SQL)

GROUPING SETS Equivalents

TSQL 分组集(Grouping Sets)的更多相关文章

  1. T-SQL基础(7) - 透视,逆透视和分组集

    透视转换: use tempdb;if object_id('dbo.Orders', 'U') is not null drop table dbo.Orders;create table dbo. ...

  2. Oracle的rollup、cube、grouping sets函数

    转载自:https://blog.csdn.net/huang_xw/article/details/6402396 Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollu ...

  3. Group By Grouping Sets

    Group by分组函数的自定义,与group by配合使用可更加灵活的对结果集进行分组,Grouping sets会对各个层级进行汇总,然后将各个层级的汇总值union all在一起,但却比单纯的g ...

  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. [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)

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

  6. Oracle分组小计、总计示例(grouping sets的使用)

    1.首先创建一个表 create table TE ( ID        VARCHAR2(2), T_CODE    VARCHAR2(4), T_NAME    VARCHAR2(4), T_A ...

  7. Oracle分组函数之Grouping Sets

    功能介绍: 自定义分组的字段 创建表: 插入测试数据: Grouping Sets(null,t.classid,(t.classid,t.studentname)),类似于ROLLUP Select ...

  8. SQL Server里Grouping Sets的威力

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

  9. GROUPING SETS、CUBE、ROLLUP

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

随机推荐

  1. tLinux 2.2下安装Mono 4.8

    Tlinux2.2发行版基于CentOS 7.2.1511研发而成,内核版本与Tlinux2.0发行版保持完全一致,更加稳定,并保持对Tlinux2.0的完全兼容.Mono 4版本要求CentOS 7 ...

  2. 结合Jexus + Kestrel 部署 asp.net core 生产环境

    ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依赖. 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: ...

  3. .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper

    好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...

  4. JavaScript动画-碰撞检测

    ▓▓▓▓▓▓ 大致介绍 碰撞检测是指在页面中有多个元素时,拖拽一个元素会出现碰撞问题,碰撞检测是以模拟拖拽和磁性吸附中的范围限定为基础的 效果:碰撞检测 ▓▓▓▓▓▓ 碰撞检测 先来看看碰撞检测的原理 ...

  5. PhotoView实现图片随手势的放大缩小的效果

    项目需求:在listView的条目中如果有图片,点击条目,实现图片的放大,并且图片可以根据手势来控制图片放大缩小的比例.类似于微信朋友圈中查看好友发布的照片所实现的效果. 思路是这样的:当点击条目的时 ...

  6. var和dynamic的区别

    1.var 1.均是声明动态类型的变量. 2.在编译阶段已经确定类型,在初始化的时候必须提供初始化的值. 3.无法作为方法参数类型,也无法作为返回值类型. 2.dynamic 1.均是声明动态类型的变 ...

  7. 深入Java虚拟机--判断对象存活状态

    程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...

  8. WCF基础

    初入职场,开始接触C#,开始接触WCF,那么从头开始学习吧,边学边补充. SOA Service-Oriented Architecture,面向服务架构,粗粒度.开放式.松耦合的服务结构,将应用程序 ...

  9. ionic第一坑——ion-slide-box坑(ion-slide分两页的坑)

    ionic.views.Slider = ionic.views.View.inherit({ initialize: function (options) { . . . function setu ...

  10. ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id

    出现场景:当点击"分类"再返回"首页"时,发生error退出   BUG描述:Caused by: java.lang.IllegalArgumentExcep ...