聊聊SQL中的分組集
本文轉載自微信公眾號「SQL數據庫開發」,作者丶平凡世界 。轉載本文請聯系SQL數據庫開發公眾號。
分組集的定義
是多個分組的并集,用于在一個查詢中,按照不同的分組列對集合進行聚合運算,等價于對單個分組使用"UNION ALL",計算多個結果集的并集。
分組集種類
SQL Server的分組集共有三種 GROUPING SETS, CUBE, 以及ROLLUP, 其中 CUBE和ROLLUP可以當做是GROUPING SETS的簡寫版
GROUPING SETS
GROUPING SETS子句允許你指定多個GROUP BY選項。增強了GROUP BY的功能。
可以通過一條SELECT語句實現復雜繁瑣的多條SELECT語句的查詢。并且更加的
高效,解析存儲一條SQL于語句
GROUP SETS示例
我們以Customers表為例,其內容如下:
我們先分別對城市和省份進行分組,統計出他們的數量
- SELECT 城市,NULL 省份,COUNT(城市) FROM Customers
- GROUP BY 城市
- UNION ALL
- SELECT NULL,省份,COUNT(省份) FROM Customers
- GROUP BY 省份
結果為:
再使用GROUPING SETS來統計
- SELECT
- 城市,
- 省份,
- COUNT(客戶ID) 數量
- FROM Customers
- GROUP BY GROUPING SETS (城市,省份)
結果如下
其實上下兩個結果是一樣的,只是UNION ALL不排序,而GROUPING SETS增加了排序。這樣不僅減少了代碼,而且這樣的效率會比UNION ALL的效率高。通常GROUPING SETS使用在組合分析中。
ROLLUP
ROLLUP也是GROUPING SETS的一種簡略寫法,我們舉例說明。
我們先使用GROUPING SETS的多層組合
- SELECT
- 省份,
- 城市,
- COUNT(1) 數量
- FROM Customers
- GROUP BY GROUPING SETS (
- 省份,(省份,城市)
- )
其結果為:
我們使用ROLLUP可以這樣寫
- SELECT
- 省份,
- 城市,
- COUNT(客戶ID) 數量
- FROM Customers
- GROUP BY 省份,城市 WITH ROLLUP
其結果為:
我們來解讀一下ROLLUP的作用,其作用是對每個列先進行一次分組,并且對第一列的數據在每個組內還進行一次匯總,最后對所有的數據再進行一次匯總,所以相比GROUPING SETS會多了個所以數據的匯總。這個在對組內進行聚合時是經常使用到的。
CUBE
而CUBE相比ROLLUP就更多一個維度了,我們還是距離說明。
- SELECT
- 省份,
- 城市,
- COUNT(客戶ID) 數量
- FROM Customers
- GROUP BY 省份,城市 WITH CUBE
結果如下:
在ROLLUP的基礎上,還會將第一列每組的匯總數據額外顯示在最后。
總結
分組集類似于Excel的透視圖,可以對各類數據進行組內計算,這里不止可以進行數量統計,也可以進行求和,最大最小值等操作。是我們在進行數據分析時候經常使用到的一組功能。