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