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