GROUPING SETS/ROLLUP


CREATE Table Enployees  
(  
  [ID] INT IDENTITY(1,1) PRIMARY KEY ,  
  [NAME] NVARCHAR(100) ,  
  [GENDER] NVARCHAR(10),  
  [DEPARTMENT] NVARCHAR(3),  
  [SALARY] INT  
);  
GO

INSERT Enployees VALUES ('Name1', 'M', '1', 12000)  
INSERT Enployees VALUES ('Name2', 'M', '1', 24000)  
INSERT Enployees VALUES ('Name3', 'M', '2', 48000)  
INSERT Enployees VALUES ('Name4', 'F', '2', 12000)  
INSERT Enployees VALUES ('Name5', 'F', '3', 24000)  
INSERT Enployees VALUES ('Name6', 'F', '3', 48000)

SELECT GENDER  
             , DEPARTMENT  
             , SUM(SALARY) AS SALARY_TOTAL  
FROM Enployees  
GROUP BY GENDER, DEPARTMENT  
UNION  
SELECT GENDER  
       , null AS DEPARTMENT  
       , SUM(SALARY) AS SALARY_TOTAL  
FROM Enployees  
GROUP BY GENDER  
UNION  
SELECT null AS GENDER  
       , null AS DEPARTMENT  
       , SUM(SALARY) AS SALARY_TOTAL  
FROM Enployees

◎ GROUPING SETS的效能會比上面好很多

SELECT GENDER  
       , DEPARTMENT  
       , SUM(SALARY) AS SALARY_TOTAL  
FROM Enployees  
GROUP BY GROUPING SETS((GENDER,DEPARTMENT),  
                       (GENDER),  
                       ())

◎ ROLLUP的寫法又更簡潔一點

SELECT GENDER  
       , DEPARTMENT  
       , SUM(SALARY) AS SALARY_TOTAL  
       , GROUPING(GENDER) AS GENDER_PH--0代表是真實資料,1代表是個PLACEHOLDER  
       , GROUPING(DEPARTMENT) AS DEPARTMENT_PH--0代表是真實資料,1代表是個PLACEHOLDER  
FROM Enployees   
GROUP BY ROLLUP((GENDER),(DEPARTMENT))

results matching ""

    No results matching ""