1、分組匯總--概述
SQL SERVER增強了GROUP BY的功能,GROUPING SETS 子句允許你指定多個GROUP BY選項,可以通過一條SELECT語句實現復雜繁瑣的多條SELECT語句的查詢,並且更加的高效。
GROUPING SETS 的 GROUP BY 子句可以生成一個等效於由多個簡單 GROUP BY 子句的 UNION ALL 生成的結果集。
GROUPING SETS 可以生成等效於由簡單 GROUP BY、ROLLUP 或 CUBE 操作生成的結果。
GROUPING SETS、ROLLUP 或CUBE 的不同組合可以生成等效的結果集。
2、分組匯總--方法實例
SQL SERVER增強了WITH ROLLUP 能很方便的對同一個結果及進行匯總
下面通過實例說明GROUP BY、GROUPING SETS、WITH ROLLUP的用法和區別:
SQL 使用 ROLLUP 匯總數據
(1)、 准備基礎數據
CREATE TABLE #TBLPOPULATION ( COUN NVARCHAR (100) ,--國家 PROV NVARCHAR (100) ,--省份 CITY NVARCHAR (100) ,--城市 POPU INT --人口數量(百萬) ); DELETE FROM #TBLPOPULATION; INSERT INTO #TBLPOPULATION VALUES ( '中國', '河南', '鄭州', 9 ); INSERT INTO #TBLPOPULATION VALUES ( '中國', '河南', '許昌', 2 ); INSERT INTO #TBLPOPULATION VALUES ( '中國', '河北', '石家庄', 6 ); INSERT INTO #TBLPOPULATION VALUES ( '中國', '河北', '滄州', 2 ); GO SELECT * FROM #TBLPOPULATION
(2)、GROUP BY分組
--2.1常用分組方法(單分組) SELECT COUN ,PROV ,SUM(POPU) AS POPU FROM #TBLPOPULATION GROUP BY COUN, PROV ORDER BY COUN, PROV
(3)GROUPING SETS分組
--3.1分別多組合並后UNION SELECT COUN ,PROV ,SUM(POPU) AS POPU FROM #TBLPOPULATION GROUP BY GROUPING SETS(COUN ,PROV) ORDER BY COUN, PROV
--3.2分別多組多級合並后UNION--等價於ROLLUP,但比ROLLUP少一行合計 SELECT COUN ,ISNULL(PROV,'合計') AS PROV,SUM( POPU ) AS POPU FROM #TBLPOPULATION GROUP BY GROUPING SETS( (COUN), (COUN, PROV) ) ORDER BY COUN, PROV
--3.3分別多組多級合並后UNION--等價於ROLLUP,但比ROLLUP少一行合計 SELECT ISNULL (COUN, '合計') AS COUN,ISNULL( PROV,'合計' ) AS PROV,ISNULL( CITY,'合計' ) AS CITY,SUM( POPU ) AS POPU FROM #TBLPOPULATION GROUP BY GROUPING SETS( (COUN), (COUN, PROV), (COUN, PROV,CITY ) ) ORDER BY COUN, PROV ,CITY
(4)WITH ROLLUP匯總
--ROLLUP 匯總數據(比GROUPING SETS 多一合計) SELECT ISNULL (COUN, '合計') AS COUN,ISNULL( PROV,'合計' ) AS PROV,ISNULL( CITY,'合計' ) AS CITY,SUM( POPU ) AS POPU FROM #TBLPOPULATION GROUP BY COUN, PROV, CITY WITH ROLLUP;
--另外寫法,結果於上相同 SELECT CASE WHEN ( GROUPING( COUN) = 1 ) THEN N'合計' ELSE ISNULL (COUN, 'UNKNOWN') END AS COUN , CASE WHEN ( GROUPING (PROV) = 1 ) THEN N'合計' ELSE ISNULL (PROV, 'UNKNOWN') END AS PROV , CASE WHEN ( GROUPING (CITY) = 1 ) THEN N'合計' ELSE ISNULL (CITY, 'UNKNOWN') END AS CITY , SUM(POPU ) AS POPU FROM #TBLPOPULATION GROUP BY COUN, PROV, CITY WITH ROLLUP;
DROP TABLE #TBLPOPULATION;