SQL SERVER 分組組合GROUPING SETS


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;

 

 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM