SQLSERVER中GROUPINGSETS,CUBE,ROLLUP
-
SQL SERVER中GROUPING SETS,CUBE,ROLLUP
前言
全文我们将使用一个CTE语句作为基础数据:结果集是:123456789101112withtestas(selectN'LeeWhoeeUnisersity'asname,N'数据库'ascategory, 30astotalcountunionallselectN'LeeWhoeeUnisersity','.NET',20unionallselectN'DePaul',N'.NET',40unionallselectN'DePaul',N'WEB设计',30)select*fromtestname category totalcount
LeeWhoeeUnisersity 数据库 30
LeeWhoeeUnisersity .NET 20
DePaul .NET 40
DePaul WEB设计 30GROUPING SETS
使用 GROUPING SETS 的 GROUP BY 子句可以生成一个等效于由多个简单 GROUP BY 子句的 UNION ALL 生成的结果集。看实例:12345678910111213SELECTcustomer,year,SUM(sales)FROMTGROUPBYGROUPINGSETS ((customer), (year))和SELECTcustomer,NULLasyear,SUM(sales)FROMTGROUPBYcustomerUNIONALLSELECTNULLascustomer,year,SUM(sales)FROMTGROUPBYyear是等效的。123456789101112131415withtestas(selectN'LeeWhoeeUnisersity'asname,N'数据库'ascategory, 30astotalcountunionallselectN'LeeWhoeeUnisersity','.NET',20unionallselectN'DePaul',N'.NET',40unionallselectN'DePaul',N'WEB设计',30)selectname,category,sum(totalcount)as[sum]fromtestgroupbygroupingsets ((name),(category))
结果:
name category sum .NET 60 WEB设计 30 数据库 30 DePaul 70 LeeWhoeeUnisersity 50 ROLLUP
实例:123456789GROUPBYROLLUP(C1, C2, …, Cn-1, Cn)或者GROUPBYC1, C2, …, Cn-1, CnWITHROLLUP和GROUPBYGROUPINGSETS ( (C1, C2, …, Cn-1, Cn),(C1, C2, ..., Cn-1)...,(C1, C2),(C1),() )是等效的。注意WITHROLLUP是旧版本的写法,GROUPBYROLLUP只能运行于兼容性100以上的版本。相当于123456789101112131415withtestas(selectN'LeeWhoeeUnisersity'asname,N'数据库'ascategory, 30astotalcountunionallselectN'LeeWhoeeUnisersity','.NET',20unionallselectN'DePaul',N'.NET',40unionallselectN'DePaul',N'WEB设计',30)selectname,category,sum(totalcount)as[sum]fromtestgroupbyrollup(name,category)1234567891011121314151617withtestas(selectN'LeeWhoeeUnisersity'asname,N'数据库'ascategory, 30astotalcountunionallselectN'LeeWhoeeUnisersity','.NET',20unionallselectN'DePaul',N'.NET',40unionallselectN'DePaul',N'WEB设计',30)selectname,category,sum(totalcount)as[sum]fromtestgroupbygroupingsets ((name,category),(name),())结果:
ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合,如“DePaul 70,LeeWhoeeUniversity 50”。(........,())最后一对小括号()表示进行全部汇总,即结果中的120。name category sum DePaul .NET 40 DePaul WEB设计 30 DePaul 70 LeeWhoeeUnisersity .NET 20 LeeWhoeeUnisersity 数据库 30 LeeWhoeeUnisersity 50 120 CUBE
等效于1GROUPBYCUBE(C1, C2, C3)12345678GROUPBYGROUPINGSETS ( (C1, C2, C3),(C1, C2),(C1, C3),(C2, C3),(C1),(C2),(C3),() )进行CUBE测试:
12345678910111213141516withtestas(selectN'LeeWhoeeUnisersity'asname,N'数据库'ascategory, 30astotalcountunionallselectN'LeeWhoeeUnisersity','.NET',20unionallselectN'DePaul',N'.NET',40unionallselectN'DePaul',N'WEB设计',30)selectcasewhengrouping(name)=1then'allnames'elsenameendasname,casewhengrouping(category)=1then'allcategories'elsecategoryendascategory,sum(totalcount)assumfromtestgroupbycube(name,category)相当于
12345678910111213141516withtestas(selectN'LeeWhoeeUnisersity'asname,N'数据库'ascategory, 30astotalcountunionallselectN'LeeWhoeeUnisersity','.NET',20unionallselectN'DePaul',N'.NET',40unionallselectN'DePaul',N'WEB设计',30)selectcasewhengrouping(name)=1then'allnames'elsenameendasname,casewhengrouping(category)=1then'allcategories'elsecategoryendascategory,sum(totalcount)assumfromtestgroupbygroupingsets((name,category),(name),(category),())结果:
name category sum
LeeWhoeeUnisersity .NET 20
DePaul .NET 40
allnames .NET 60
DePaul WEB设计 30
allnames WEB设计 30
LeeWhoeeUnisersity 数据库 30
allnames 数据库 30
allnames allcategories 120
LeeWhoeeUnisersity allcategories 50
DePaul allcategories 70CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
聚合函数GROUPING: 当用当结果集中的行是由GROUPING SETS,CUBE,或ROLLUP生成的,则值为1否则为0。如果没有用CASE WHEN判断GROUPING,则上面所有的allnames,allcategories会被NULL替代。
浙公网安备 33010602011771号