首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server GROUP BY 進階用法全解析:CUBE、ROLLUP、GROUPING SETS、COMPUTE 與 ALL 子句

     編輯:關於SqlServer

GROUP BY 不僅是簡單分組彙總,SQL Server 提供 CUBE、ROLLUP、GROUPING SETS、COMPUTE、ALL 等進階子句,支援多維度交叉分析、階層式小計與總計。本文透過實戰範例完整示範各子句行為差異。

測試資料準備

CREATE TABLE SalesInfo
(
    City NVARCHAR(50),
    OrderDate DATETIME,
    OrderID INT
);

INSERT INTO SalesInfo VALUES
(N'北京','2014-06-09',1001), (N'北京','2014-08-09',1002), (N'北京','2013-10-09',1009),
(N'大連','2013-08-09',4001), (N'大連','2013-10-09',4002), (N'大連','2013-05-12',4003),
(N'大連','2014-11-11',4004), (N'大連','2014-12-11',4005);

一、CUBE:全維度交叉彙總

產生所有分組欄位組合的彙總 (含總計)。

單一欄位 CUBE

SELECT City, COUNT(OrderID) AS OrderCount
FROM SalesInfo
GROUP BY City WITH CUBE;

結果:各城市筆數 + 總計列 (City 為 NULL)。

多欄位 CUBE

SELECT City, YEAR(OrderDate) AS OrderYear, COUNT(OrderID) AS OrderCount
FROM SalesInfo
GROUP BY City, YEAR(OrderDate) WITH CUBE;

結果:(City, Year) 明細 + 各城市年度小計 + 各年度城市小計 + 總計。

二、ROLLUP:階層式小計

依 GROUP BY 欄位順序產生階層小計,僅對第一個欄位產生總計。

SELECT City, YEAR(OrderDate) AS OrderYear, COUNT(OrderID) AS OrderCount
FROM SalesInfo
GROUP BY City, YEAR(OrderDate) WITH ROLLUP;

結果:(City, Year) 明細 + 各城市年度小計 + 總計 (無各年度跨城市小計)。

三、ALL:保留篩選條件外的分組

GROUP BY ALL 會顯示所有分組值,即使 WHERE 條件篩選掉該分組的資料列 (彙總值為 0)。

SELECT City, COUNT(OrderID) AS OrderCount
FROM SalesInfo
WHERE City = N'大連'
GROUP BY ALL City;

結果:顯示「北京」(筆數 0) 與「大連」(筆數 5)。

限制: ALL 不可與 CUBE/ROLLUP 同時使用;搭配 HAVING 時 ALL 失效。

四、COMPUTE / COMPUTE BY:傳統報表輸出

注意: 此為舊版功能,現代應用建議改用 GROUPING SETS 或應用層處理。

COMPUTE:單一總計

SELECT City, OrderDate, OrderID
FROM SalesInfo
COMPUTE COUNT(OrderID);

輸出兩個結果集:明細資料 + 總筆數。

COMPUTE BY:分組小計

SELECT City, OrderDate, OrderID
FROM SalesInfo
ORDER BY City
COMPUTE COUNT(OrderID) BY City;

輸出多個結果集:依城市分組的明細 + 各城市小計。

現代替代方案:GROUPING SETS

SQL Server 2008+ 建議使用 GROUPING SETS 彈性定義彙總組合:

SELECT City, YEAR(OrderDate) AS OrderYear, COUNT(OrderID) AS OrderCount
FROM SalesInfo
GROUP BY GROUPING SETS
(
    (City, YEAR(OrderDate)),  -- 明細
    (City),                   -- 城市小計
    (YEAR(OrderDate)),        -- 年度小計
    ()                        -- 總計
);

子句比較總覽

子句彙總範圍適用場景備註
CUBE所有組合 + 總計多維度完整交叉分析組合數 = 2^n,欄位多時結果集龐大
ROLLUP階層式 + 總計報表階層小計 (如 區域→城市→門市)欄位順序決定階層
GROUPING SETS自訂組合精確控制彙總粒度,效能最佳現代標準語法
ALL保留空分組報表需顯示無資料分類不可與 CUBE/ROLLUP 共用
COMPUTE/BY結果集分離輸出舊版報表工具相容已棄用,不建議新專案使用

善用進階 GROUP BY 子句,能直接在資料庫層完成複雜的多維度彙總,減少應用層運算與資料傳輸量。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved