SQL中的分組集
點擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,
設(shè)為“置頂或星標”,第一時間送達干貨 SQL專欄 SQL基礎(chǔ)知識第二版
SQL高級知識第二版
分組集的定義
是多個分組的并集,用于在一個查詢中,按照不同的分組列對集合進行聚合運算,等價于對單個分組使用"UNION ALL",計算多個結(jié)果集的并集。
分組集種類
SQL Server的分組集共有三種 GROUPING SETS, CUBE, 以及ROLLUP, 其中 CUBE和ROLLUP可以當(dāng)做是GROUPING SETS的簡寫版
GROUPING SETS
GROUPING SETS子句允許你指定多個GROUP BY選項。增強了GROUP BY的功能。
可以通過一條SELECT語句實現(xiàn)復(fù)雜繁瑣的多條SELECT語句的查詢。并且更加的
高效,解析存儲一條SQL于語句
GROUP SETS示例
我們以Customers表為例,其內(nèi)容如下:

我們先分別對城市和省份進行分組,統(tǒng)計出他們的數(shù)量
SELECT 城市,NULL 省份,COUNT(城市) FROM Customers
GROUP BY 城市
UNION ALL
SELECT NULL,省份,COUNT(省份) FROM Customers
GROUP BY 省份結(jié)果為:

再使用GROUPING SETS來統(tǒng)計
SELECT
城市,
省份,
COUNT(客戶ID) 數(shù)量
FROM Customers
GROUP BY GROUPING SETS (城市,省份)結(jié)果如下

其實上下兩個結(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的作用,其作用是對每個列先進行一次分組,并且對第一列的數(shù)據(jù)在每個組內(nèi)還進行一次匯總,最后對所有的數(shù)據(jù)再進行一次匯總,所以相比GROUPING SETS會多了個所以數(shù)據(jù)的匯總。這個在對組內(nèi)進行聚合時是經(jīng)常使用到的。
CUBE
而CUBE相比ROLLUP就更多一個維度了,我們還是距離說明。
SELECT
省份,
城市,
COUNT(客戶ID) 數(shù)量
FROM Customers
GROUP BY 省份,城市 WITH CUBE結(jié)果如下:

在ROLLUP的基礎(chǔ)上,還會將第一列每組的匯總數(shù)據(jù)額外顯示在最后。
總結(jié)
分組集類似于Excel的透視圖,可以對各類數(shù)據(jù)進行組內(nèi)計算,這里不止可以進行數(shù)量統(tǒng)計,也可以進行求和,最大最小值等操作。是我們在進行數(shù)據(jù)分析時候經(jīng)常使用到的一組功能。
最后給大家分享我寫的SQL兩件套:《SQL基礎(chǔ)知識第二版》和《SQL高級知識第二版》的PDF電子版。里面有各個語法的解釋、大量的實例講解和批注等等,非常通俗易懂,方便大家跟著一起來實操。
有需要的讀者可以下載學(xué)習(xí),在下面的公眾號「數(shù)據(jù)前線」(非本號)后臺回復(fù)關(guān)鍵字:SQL,就行 數(shù)據(jù)前線
后臺回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨
后臺回復(fù)關(guān)鍵字:進群,帶你進入高手如云的交流群。

