| 特性 | GROUP BY | COMPUTE BY |
|---|---|---|
| 結果集 | 單一結果集 (彙總列) | 多結果集 (明細 + 小計/總計) |
| SELECT 清單 | 僅群組欄 + 彙總函數 | 可包含非群組欄位 |
| 彙總定義 | 在 SELECT 清單 | 在 COMPUTE 子句 |
| 客戶端處理 | 簡單 | 需處理多結果集 (游標) |
SELECT select_list
FROM table
ORDER BY group_columns
COMPUTE { aggregate_function(column) [ ,... ] } [ BY group_columns ];
-- 1. 總計
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance);
-- 2. 分組小計
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance) BY type;
第二個查詢回傳 12 個結果集:每組一個明細結果集 + 一個小計結果集。
DISTINCT 與列統計函數。COMPUTE ... BY 欄位必須出現在 SELECT 清單。SELECT INTO (結果非規則資料列)。BY 欄位順序需與 ORDER BY 前 N 欄一致。BY,可省略 ORDER BY (僅總計)。BY 產生多層小計 (大組 → 子組)。COMPUTE BY 針對不同群組各產生統計。COMPUTE BY 可包含多個彙總函數。COMPUTE 無 BY 時僅對全集統計。COMPUTE / COMPUTE BY 子句中 不可包含 ntext、text、image 型別欄位。
-- 使用 GROUPING SETS / ROLLUP (SQL 2008+)
SELECT type, SUM(price) AS SumPrice, SUM(advance) AS SumAdvance
FROM titles
GROUP BY ROLLUP (type); -- 含總計列 (type=NULL)
-- 或應用層處理:先查明細,再用程式計算小計/總計
COMPUTE BY 為舊版相容功能,新專案不建議使用。現代應用請改用 GROUPING SETS、ROLLUP、CUBE 或應用層運算,結果集結構規則、效能佳、工具支援完整。