依字母/數字排序,相似值聚集。但 排序 ≠ 分組:ORDER BY 顯示每筆記錄,分組代表多筆記錄彙總。
同值僅顯示一列。SELECT ZIP FROM Customers GROUP BY ZIP 回傳唯一郵遞區號。SELECT 清單必須符合 GROUP BY 清單,除非包含彙總函數。GROUP BY 不保證輸出順序,需配合 ORDER BY。
SELECT ZIP FROM Customers WHERE State = 'KY' GROUP BY ZIP 僅回傳肯州郵遞區號。WHERE 在分組前計算,不支援彙總函數。
加入 ALL 關鍵字:SELECT ZIP, COUNT(ZIP) FROM Customers WHERE State = 'KY' GROUP BY ALL ZIP。結果包含所有 ZIP,非肯州分組計數顯示 0。遠端查詢不支援 GROUP BY ALL。
WHERE 過濾記錄,HAVING 過濾分組。SELECT ZIP, COUNT(ZIP) FROM Customers GROUP BY ZIP HAVING COUNT(ZIP) = 1 僅顯示單一客戶的郵遞區號。HAVING 在 GROUP BY 後計算,常搭配彙總函數。
SELECT OrderID, SUM(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY OrderID。SELECT 包含彙總函數時,可不受 GROUP BY 欄位限制。
SELECT Customer, OrderNumber, SUM(Cost*Quantity) FROM Orders GROUP BY Customer, OrderNumber WITH ROLLUP。每分組產生小計,第一列為總計。不支援 DISTINCT 與 GROUP BY ALL。
... GROUP BY Customer, OrderNumber WITH CUBE。在 ROLLUP 基礎上,再對每個定義分組的欄位產生小計 (所有欄位組合)。不支援 GROUP BY ALL。
SELECT GROUPING(Customer), OrderNumber, SUM(...) FROM Orders GROUP BY Customer, OrderNumber WITH CUBE。結果:1 = 小計列 (ROLLUP/CUBE 產生),0 = 明細列 (原始 GROUP BY 產生)。
| 子句/選項 | 執行階段 | 支援彙總 | 典型用途 |
|---|---|---|---|
| WHERE | GROUP BY 前 | 否 | 列層級過濾 |
| GROUP BY | 核心分組 | 否 (SELECT 除外) | 建立分組 |
| HAVING | GROUP BY 後 | 是 | 分組層級過濾 |
| WITH ROLLUP | 分組後 | 是 | 階層小計 |
| WITH CUBE | 分組後 | 是 | 交叉小計 |
| GROUPING() | 輸出時 | N/A | 識別小計列 |