ROLLUP 運算子可用來產生包含小計與總數的報告。ROLLUP 運算子將產生一個類似於 CUBE 運算子產生之結果集的結果集。如需詳細資訊,請參閱<使用 CUBE 來摘要資料>。
以下是 CUBE 與 ROLLUP 之間的特定差異:
- CUBE 將產生一個結果集,顯示出選定資料行之所有值組合的彙總。
- ROLLUP 將產生一個結果集,顯示出選取的資料行中值階層的彙總。
例如,一個簡單的 Inventory 資料表包含了:
Item Color Quantity
-------------------- -------------------- --------------------------
Table Blue 124
Table Red 223
Chair Blue 101
Chair Red 210
下列查詢將產生一個小計報告:
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
ELSE ISNULL(Item, 'UNKNOWN')
END AS Item,
CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'
ELSE ISNULL(Color, 'UNKNOWN')
END AS Color,
SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH ROLLUP
Item Color QtySum
-------------------- -------------------- --------------------------
Chair Blue 101.00
Chair Red 210.00
Chair ALL 311.00
Table Blue 124.00
Table Red 223.00
Table ALL 347.00
ALL ALL 658.00
(7 row(s) affected)
若查詢中的 ROLLUP 關鍵字變更成 CUBE,CUBE 結果集將保持不變,但最後將傳回兩個額外的資料列:
ALL Blue 225.00
ALL Red 433.00
CUBE 作業將從 Item 與 Color 產生可能值組合的資料列。例如,CUBE 不只會報告 Color 值連同 Item 值 Chair (Red、Blue 以及 Red + Blue) 的所有可能組合,它也會報告 Item 值連同 Color 值 Red (Chair、Table 以及 Chair + Table) 的所有可能組合。
對於 GROUP BY 子句右邊資料行中的每個值,ROLLUP 作業並不會報告左邊資料行 (或多個資料行) 的所有可能值組合。例如,ROLLUP 並不會針對每個 Color 值報告 Item 值的所有可能組合。
ROLLUP 作業之結果集的作用和 COMPUTE BY 傳回的結果集類似。不過,ROLLUP 具有下列優點:
- ROLLUP 將傳回一個結果集,而 COMPUTE BY 則傳回多個結果集,它將增加應用程式碼的複雜度。
- ROLLUP 可用於伺服端資料指標,而 COMPUTE BY 則不能。
- 有時候查詢最佳化工具產生的 ROLLUP 執行計劃會比 COMPUTE BY 的執行計劃來得有效率。