T-SQL中的GROUP BY GROUPING SETS
最近遇到一個(gè)情況,需要在內(nèi)網(wǎng)系統(tǒng)中出一個(gè)統(tǒng)計(jì)報(bào)表。需要根據(jù)不同條件使用多個(gè)group by語(yǔ)句.需要將所有聚合的數(shù)據(jù)進(jìn)行UNION操作來(lái)完成不同維度的統(tǒng)計(jì)查看.
??? 直到發(fā)現(xiàn)在SQL SERVER 2008之后引入了GROUPING SETS這個(gè)對(duì)于GROUP BY的增強(qiáng)后,上面的需求實(shí)現(xiàn)起來(lái)就簡(jiǎn)單多了,下面我用AdventureWork中的表作為DEMO來(lái)解釋一下GROUPING SETS.
??? 假設(shè)我現(xiàn)在需要兩個(gè)維度查詢我的銷售訂單,查詢T-SQL如下:
???
??? 而使用SQL SERVER 2008之后新增的GROUPING SETS語(yǔ)句,僅僅需要這樣寫:
???
???? 值得注意的是,雖然上面使用GROUPING SETS語(yǔ)句和多個(gè)GROUP BY語(yǔ)句產(chǎn)生的結(jié)果是完全一樣的,但順序卻完全不同。
GROUPING SETS,僅僅是語(yǔ)法糖?
??? 從上面結(jié)果來(lái)看,使用GROUPING SETS僅僅是一個(gè)可以少寫些代碼的語(yǔ)法糖.但實(shí)際情況是,GROUPING SETS在遇到多個(gè)條件時(shí),聚合是一次性從數(shù)據(jù)庫(kù)中取出所有需要操作的數(shù)據(jù),在內(nèi)存中對(duì)數(shù)據(jù)庫(kù)進(jìn)行聚合操作并生成結(jié)果。而UNION ALL是多次掃描表,將返回的結(jié)果進(jìn)行UNION操作,這也就是為什么GROUPING SETS和UNION操作所返回的數(shù)據(jù)順序是不同的.
??? 下面通過(guò)查看上面兩個(gè)語(yǔ)句的IO和CPU來(lái)進(jìn)行對(duì)比:
???
??? 通過(guò)上面的圖來(lái)看GROUPING SETS不僅僅只是語(yǔ)法糖.而是從執(zhí)行原理上做出了改變.
??? 對(duì)于GROUPING SETS來(lái)說(shuō),還經(jīng)常和GROUPING函數(shù)聯(lián)合使用,這個(gè)函數(shù)是反映目標(biāo)列是否聚合,如何聚合則返回1,否則返回0,如下:
???
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的T-SQL中的GROUP BY GROUPING SETS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 理解SQL Server中索引的概念,原
- 下一篇: T-SQL查询进阶--变量