TSql Grouping Sets

TSql Group by clause主要有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))

rollup 和cube的作用是预定义grouping sets(分组集),rollup(a,b) 预定义的分组集是(),(a),(a,b);cube(a,b)预定义的的分组集是(),(a),(b),(a,b)。

grouping sets实现分组集聚合,功能非常强大,以下示例使用group by a,b子句来解释grouping sets。

group by grouping sets(rollup(a,b),b) 等价于 group by cube(a,b),因为rollup(a,b)的grouping set是(),(a),(a,b),在加上(b),等价于cube(a,b).

1,创建示例数据

IF OBJECT_ID(‘dbo.Inventory‘) is not null
drop table dbo.Inventory
go

create table dbo.Inventory
(
    Store varchar(2),
    Item varchar(20),
    Color varchar(10),
    Quantity int
)

insert into dbo.Inventory values(‘NY‘,‘Table‘,‘Blue‘,124)
insert into dbo.Inventory values(‘NJ‘,‘Table‘,‘Blue‘,100)
insert into dbo.Inventory values(‘NY‘,‘Table‘,‘Red‘,29)
insert into dbo.Inventory values(‘NJ‘,‘Table‘,‘Red‘,56)
insert into dbo.Inventory values(‘PA‘,‘Table‘,‘Red‘,138)
insert into dbo.Inventory values(‘NY‘,‘Table‘,‘Green‘,229)
insert into dbo.Inventory values(‘PA‘,‘Table‘,‘Green‘,304)
insert into dbo.Inventory values(‘NY‘,‘Chair‘,‘Blue‘,101)
insert into dbo.Inventory values(‘NJ‘,‘Chair‘,‘Blue‘,22)
insert into dbo.Inventory values(‘NY‘,‘Chair‘,‘Red‘,21)
insert into dbo.Inventory values(‘NJ‘,‘Chair‘,‘Red‘,10)
insert into dbo.Inventory values(‘PA‘,‘Chair‘,‘Red‘,136)
insert into dbo.Inventory values(‘NJ‘,‘Sofa‘,‘Green‘,2)

2, grouping set 是()

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(())

2, grouping set 是(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

3,grouping set是(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))  --(Item)
order by Item

4,grouping set是(b)

select null as Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
from dbo.Inventory
group by  Color
order by Color

--等价于
select null as Item,Color,SUM(Quantity) as TotalQuantity,COUNT(Store) as Stores
from dbo.Inventory
group by grouping sets( (Color)) --(Color)
order by Color

5,group by rollup(a,b)的grouping set是(),(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,group by cube(a,b)的grouping set是(),(a),(b),(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

7,对rollup(a,b)或cube(a,b)也可以使用相同的grouping set对应的group by和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 

order by Item,Color
--rollup(a,b)的grouping sets是(),(a),(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 

order by Item,Color

8,group by grouping sets(rollup(a,b),b) 等价于 group by cube(a,b),因为rollup(a,b)的grouping set是(),(a),(a,b),在加上(b),等价于cube(a,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

总结:

1, cube和rollup定义了grouping set的简单方式,rollup(a,b)定义的grouping set是(),(a),(a,b), cube(a,b)定义的grouping set是(),(a),(b),(a,b)。

2,grouping函数和grouping_id函数 用来判断字段是否属于表中的数据行。

Grouping(字段名) 用来区分当前行是不是小计产生的行,  Grouping(字段名)=1 说明是统计行,Grouping(字段名)=0 说明是表中行

Group_id(a,b,c)

参考文档

https://msdn.microsoft.com/zh-cn/library/bb510624(v=sql.110).aspx

https://msdn.microsoft.com/zh-cn/library/ms178544(v=sql.110).aspx https://msdn.microsoft.com/zh-cn/library/ms177673(v=sql.110).aspx

时间: 2024-08-10 02:44:56

TSql Grouping Sets的相关文章

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

T-Sql语法:GROUP BY子句GROUPING SETS、CUBE、ROLLUP

#cnblogs_post_body h1 { background-color: #A5A5A5; color: white; padding: 5px } GROUP BY子句 1.ROLLUP() 生成某一维度的分组的小计行,还生成一个总计行. 示例表: select * from student 我们来看一下具体示例: select sex,sclass,sum(score) from student group by rollup(sex,sclass) 如图中所示,ROLLUP()为

GROUPING SETS、CUBE、ROLLUP

其实还是写一个Demo 比较好 USE tempdb IF OBJECT_ID( 'dbo.T1' , 'U' )IS NOT NULL BEGIN DROP TABLE dbo.T1; END; GO CREATE TABLE dbo.T1 ( id INT , productName VARCHAR(200) , price MONEY , num INT , amount INT , operatedate DATETIME ) GO DECLARE @i INT DECLARE @ran

SQL Server里Grouping Sets的威力

在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务).我不是说在生产里使用开发版,也不是说安装盗版SQL Server. 不可能的任务?未必,因为通过SQL Server里所谓的Grouping Sets就可以.在这篇文章里我会给你概括介绍下Grouping Sets,使用它们可以实现哪类查询,什么是它们的性能优势. 使用Grouping Sets的聚合 假设你有个订单表,你想进行跨多个分组的T-SQL聚集查询.在Adventur

Group By 多个分组集小结 --GROUPING SETS,GROUP BY CUBE,GROUP BY ROLLUP,GROUPING(),GROUPING_ID()

T-SQL 多个分组集共有三种 GROUPING SETS, CUBE, 以及ROLLUP, 其中 CUBE和ROLLUP可以当做是GROUPING SETS的简写版 示例数据库下载: http://files.cnblogs.com/files/haseo/TSQL2012.rar GROUPING SETS 列出所有你设置的分组集 SELECT shipperid, YEAR(shippeddate) AS shipyear, COUNT(*) AS numorders FROM Sales

SQL Server ->> GROUPING SETS, CUBE, ROLLUP, GROUPING, GROUPING_ID

在我们制作报表的时候常常需要分组聚合.多组聚合和总合.如果通过另外的T-SQL语句来聚合难免性能太差.如果通过报表工具的聚合功能虽说比使用额外的T-SQL语句性能上要好很多,不过不够干脆,还是需要先生成整个结果集然后再聚合,而且最最重要的时很多情况下报表的聚合功能可能没办法达到我们需要的效果.GROUPING SETS, CUBE, ROLLUP, GROUPING, GROUPING_ID这几个聚合函数的作用就是在原始语句的基础上完成很多像财务报表需要的聚合功能. GROUPING SETS相

SQL Server2008 程序设计 汇总 GROUP BY,WITH ROLLUP,WITH CUBE,GROUPING SETS(..)

--SQL Server2008 程序设计 汇总 GROUP BY ,WITH ROLLUP  WITH CUBE  GROUPING SET(..) /******************************************************************************** *主题:SQL Server2008 程序设计 汇总 group by ,WITH ROLLUP  WITH CUBE *说明:本文是个人学习的一些笔记和个人愚见 *      有很多

[Oracle] Group By 语句的扩展 - Rollup、Cube和Grouping Sets

常常写SQL语句的人应该知道Group by语句的主要使用方法是进行分类汇总,以下是一种它最常见的使用方法(依据部门.职位分别统计业绩): SELECT a.dname,b.job,SUM(b.sal) sum_sal FROM dept a,emp b WHERE a.deptno = b.deptno GROUP BY a.dname,b.job; DNAME JOB SUM_SAL -------------- --------- ---------- SALES MANAGER 2850

oracle group by rollup,decode,grouping,nvl,nvl2,nullif,grouping_id,group_id,grouping sets,RATIO_TO

干oracle 047文章12当问题,经验group by 声明.因此邂逅group by  rollup,decode,grouping,nvl,nvl2,nullif,RATIO_TO_REPORT等一下. 1. decode  与if...then,case...when...这类流数据语句功能差点儿相同 decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义例如以下: IF 条件=值1 THEN RETURN(值1) ELSIF 条件=值2 TH