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

SQL GROUP BY 進階:CUBE、ROLLUP 與 GROUPING 函數實戰詳解

     編輯:關於SqlServer

GROUP BY 的擴展運算符 CUBE、ROLLUP 與輔助函數 GROUPING() 能在單次查詢中產生多維度彙總,是報表開發的利器。

核心概念速覽

運算符行為輸出行數(以兩列為例)
CUBE所有列組合的聚合(全交叉)(n+1)×(m+1)
ROLLUP層級聚合:按列順序由細到粗n×m + n + 1

實戰演示環境

CREATE TABLE dbo.PeopleInfo (
    id INT IDENTITY(1,1) PRIMARY KEY,
    [name] NCHAR(10),
    numb NCHAR(10) NOT NULL,
    phone NCHAR(10),
    FenShu INT
);

INSERT INTO dbo.PeopleInfo([name],numb,phone,FenShu) VALUES
(N'李歡',N'3223',N'1365255',80),
(N'李歡',N'322123',N'1',90),
(N'李名',N'3213112352',N'13152',56),
(N'李名',N'32132312',N'13342563',60),
(N'王華',N'3223',N'1365255',80);

場景 1:CUBE vs 普通 GROUP BY

-- 普通分組
SELECT [name], numb, SUM(FenShu) AS Total
FROM dbo.PeopleInfo
GROUP BY [name], numb;

-- WITH CUBE
SELECT [name], numb, SUM(FenShu) AS Total
FROM dbo.PeopleInfo
GROUP BY [name], numb WITH CUBE;

結果差異:CUBE 額外產生 (李歡, NULL, 170)、(NULL, 3223, 160)、(NULL, NULL, 366) 等行,實現「按姓名彙總」「按工號彙總」「總計」三維度並存。

場景 2:CUBE vs ROLLUP

SELECT [name], numb, SUM(FenShu) AS Total
FROM dbo.PeopleInfo
GROUP BY [name], numb WITH ROLLUP;

關鍵規律:ROLLUP 只對 最右側列 逐級向上彙總。上例中 GROUP BY [name], numb 會產生:

  • 明細行
  • 按 [name], numb 分組小計
  • 按 [name] 分組小計(忽略 numb)
  • 總計

不會 出現「按 numb 分組、忽略 name」的行。若交換列順序 GROUP BY numb, [name],層級遞歸方向隨之改變。

GROUPING() 函數:識別彙總行

SELECT 
    [name], 
    numb, 
    SUM(FenShu) AS Total,
    GROUPING([name]) AS IsNameTotal,
    GROUPING(numb) AS IsNumbTotal
FROM dbo.PeopleInfo
GROUP BY [name], numb WITH ROLLUP;
  • 返回 1 = 該行由 CUBE/ROLLUP 產生(彙總行)
  • 返回 0 = 原始明細行

常用於報表前端區分「小計/總計」行以加粗或標註。

進階技巧:GROUPING SETS 自定義組合

SQL Server 2008+ 支援 GROUPING SETS 精確控制輸出組合,避免 CUBE/ROLLUP 產生冗餘行:

GROUP BY GROUPING SETS (
    ([name], numb),  -- 明細
    ([name]),       -- 按姓名彙總
    ()              -- 總計
)

總結

  • CUBE:全排列彙總,適合多維分析(OLAP)。
  • ROLLUP:層級鑽取,適合階層報表(年→季→月)。
  • GROUPING():程式化識別彙總行,配合 CASE 輸出「總計」「小計」標籤。
  • 大數據量時謹慎使用 CUBE,結果集呈指數級增長。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved