TSQL 分组集(Grouping Sets)
分组集(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) 的并集,查询的结果等价于:
- group by (a,b)
- union all
- 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,创建示例数据
- create table dbo.Inventory
- (
- Item int not null,
- Color varchar(10) not null,
- Quantity int not null,
- Store int not null
- )
2,将整个集合作为一个分组,grouping sets 是()
- select null as Item, null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- --等价于
- select null as Item, null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by grouping sets(())
3,grouping sets是(a)
- select Item,null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by Item
- order by Item
- --等价于
- select Item,null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by grouping sets( (Item))
- order by Item
4,grouping sets 是(a,b)
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from Inventory
- group by Item,Color
- order by Item,Color
- --等价于
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from Inventory
- group by grouping sets( (Item,Color))
- order by Item,Color
5,分组集是:rollup(a,b),或 grouping sets是((),(a),(a,b))
- --rollup(a,b)的grouping sets是(),(a),(a,b)
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by ROLLUP(Item,Color)
- order by Item,Color
- --等价于
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by grouping sets((),(Item),(Item,Color))
- order by Item,Color
6,分组集是:cube(a,b),或grouping sets是(),(a),(b),(a,b)
- --cube(a,b)的grouping sets是(),(a),(b),(a,b)
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by ROLLUP(Item,Color)
- order by Item,Color
- --等价于
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by grouping sets((),(Item),(Color),(Item,Color))
- order by Item,Color
7,对rollup(a,b),使用单个分组和union来实现
- --rollup(a,b)的grouping sets是(),(a),(a,b)
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by ROLLUP(Item,Color)
- order by Item,Color
- --等价于
- select null as Item, null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- union ALL
- select Item,null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by Item
- union ALL
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by Item,Color
8,对cube(a,b),使用单个分组和union来实现
- --cube(a,b)的grouping sets是(),(a),(b),(a,b)
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by cube(Item,Color)
- order by Item,Color
- --等价于
- select null as Item, null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- union ALL
- select Item,null as Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by Item
- union ALL
- select null as Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by Color
- union all
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by Item,Color
9, cube(a,b)的等价分组集是:grouping sets(rollup(a,b),b),或grouping sets((),(a),(a,b),(b))
- --cube(a,b)的组合是(),(a),(b),(a,b)
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from Inventory
- group by CUBE( Item,Color)
- order by Item,Color
- --等价于
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by grouping sets((),(Item),(Color),(Item,Color))
- order by Item,Color
- --等价于
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by grouping sets(rollup(Item,Color),(Color))
- 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)}
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by grouping sets((Item),(Color)),rollup(Item)
- order by Item,Color
- --等价于
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by grouping sets((Item),(Color),(Item,Item),(Color,Item))
- 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 运算求并集。
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by grouping sets((Item,Color)),rollup(Item)
- order by Item,Color
- --等价于
- select Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
- from dbo.Inventory
- group by grouping sets((Item,Color),(Color,Item))
- 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)),表示的是分组集的并集,等价于:
- grouping sets(a)
- union all
- grouping sets(b)
参考文档:
Using GROUP BY with ROLLUP, CUBE, and GROUPING SETS
TSQL 分组集(Grouping Sets)的更多相关文章
- T-SQL基础(7) - 透视,逆透视和分组集
透视转换: use tempdb;if object_id('dbo.Orders', 'U') is not null drop table dbo.Orders;create table dbo. ...
- Oracle的rollup、cube、grouping sets函数
转载自:https://blog.csdn.net/huang_xw/article/details/6402396 Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollu ...
- Group By Grouping Sets
Group by分组函数的自定义,与group by配合使用可更加灵活的对结果集进行分组,Grouping sets会对各个层级进行汇总,然后将各个层级的汇总值union all在一起,但却比单纯的g ...
- Group By 多个分组集小结 --GROUPING SETS,GROUP BY CUBE,GROUP BY ROLLUP,GROUPING(),GROUPING_ID()
T-SQL 多个分组集共有三种 GROUPING SETS, CUBE, 以及ROLLUP, 其中 CUBE和ROLLUP可以当做是GROUPING SETS的简写版 示例数据库下载: http:// ...
- [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)
原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用 ...
- Oracle分组小计、总计示例(grouping sets的使用)
1.首先创建一个表 create table TE ( ID VARCHAR2(2), T_CODE VARCHAR2(4), T_NAME VARCHAR2(4), T_A ...
- Oracle分组函数之Grouping Sets
功能介绍: 自定义分组的字段 创建表: 插入测试数据: Grouping Sets(null,t.classid,(t.classid,t.studentname)),类似于ROLLUP Select ...
- SQL Server里Grouping Sets的威力
在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务).我不是说在生产里使用开发版,也不是说安装盗版SQL Server. 不可能的任务 ...
- GROUPING SETS、CUBE、ROLLUP
其实还是写一个Demo 比较好 USE tempdb IF OBJECT_ID( 'dbo.T1' , 'U' )IS NOT NULL BEGIN DROP TABLE dbo.T1; END; G ...
随机推荐
- tLinux 2.2下安装Mono 4.8
Tlinux2.2发行版基于CentOS 7.2.1511研发而成,内核版本与Tlinux2.0发行版保持完全一致,更加稳定,并保持对Tlinux2.0的完全兼容.Mono 4版本要求CentOS 7 ...
- 结合Jexus + Kestrel 部署 asp.net core 生产环境
ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依赖. 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: ...
- .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper
好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...
- JavaScript动画-碰撞检测
▓▓▓▓▓▓ 大致介绍 碰撞检测是指在页面中有多个元素时,拖拽一个元素会出现碰撞问题,碰撞检测是以模拟拖拽和磁性吸附中的范围限定为基础的 效果:碰撞检测 ▓▓▓▓▓▓ 碰撞检测 先来看看碰撞检测的原理 ...
- PhotoView实现图片随手势的放大缩小的效果
项目需求:在listView的条目中如果有图片,点击条目,实现图片的放大,并且图片可以根据手势来控制图片放大缩小的比例.类似于微信朋友圈中查看好友发布的照片所实现的效果. 思路是这样的:当点击条目的时 ...
- var和dynamic的区别
1.var 1.均是声明动态类型的变量. 2.在编译阶段已经确定类型,在初始化的时候必须提供初始化的值. 3.无法作为方法参数类型,也无法作为返回值类型. 2.dynamic 1.均是声明动态类型的变 ...
- 深入Java虚拟机--判断对象存活状态
程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...
- WCF基础
初入职场,开始接触C#,开始接触WCF,那么从头开始学习吧,边学边补充. SOA Service-Oriented Architecture,面向服务架构,粗粒度.开放式.松耦合的服务结构,将应用程序 ...
- ionic第一坑——ion-slide-box坑(ion-slide分两页的坑)
ionic.views.Slider = ionic.views.View.inherit({ initialize: function (options) { . . . function setu ...
- ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id
出现场景:当点击"分类"再返回"首页"时,发生error退出 BUG描述:Caused by: java.lang.IllegalArgumentExcep ...