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