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

SQL GROUP BY 完整攻略:從入門到進階

     編輯:關於SqlServer

核心概念

GROUP BY 依指定欄位將資料集劃分為若干群組,再搭配彙總函數(SUM、COUNT、AVG 等)對每群組計算單一結果值。

範例資料表 A

類別摘要數量
aa200111
aa20012
aa20025
bb200110
bb20028
cc200115

1. 基本分組彙總

SELECT 類別, SUM(數量) AS 數量之和
FROM A
GROUP BY 類別;

結果:

類別數量之和
a18
b18
c15

2. 加入排序

SELECT 類別, SUM(數量) AS 數量之和
FROM A
GROUP BY 類別
ORDER BY SUM(數量) DESC;

注意:Access 不支援 ORDER BY 別名,需寫完整彙總運算式;SQL Server 則支援別名排序。

3. SELECT 清單欄位限制

-- 錯誤:摘要未出現在 GROUP BY 也未在彙總函數中
SELECT 類別, SUM(數量) AS 數量之和, 摘要
FROM A
GROUP BY 類別;

正確寫法:

  • 將 摘要 加入 GROUP BY(多欄分組)
  • 或用彙總函數包裹:MAX(摘要)

4. 多欄分組

SELECT 類別, 摘要, SUM(數量) AS 數量之和
FROM A
GROUP BY 類別, 摘要;

結果會依 類別+摘要 組合分組,上例中 a, a2001 兩筆合併為 13。

補充:GROUP BY ALL 為舊語法(保留無資料群組),未來版本將移除,請改用標準多欄分組。

5. 常用彙總函數對照

函數說明支援性
SUM加總通用
AVG平均通用
COUNT(*)列數(含 NULL)通用
COUNT(欄位)非 NULL 計數通用
MAX/MIN最大/最小值通用
FIRST/LAST第一/最後一筆僅 Access

6. HAVING vs WHERE

子句執行時機可用彙總函數用途
WHERE分組前不可過濾明細列
HAVING分組後可過濾群組
-- 僅保留總數量 > 18 的類別
SELECT 類別, SUM(數量) AS 數量之和
FROM A
GROUP BY 類別
HAVING SUM(數量) > 18;

7. COMPUTE / COMPUTE BY(舊功能,僅 SQL Server 支援)

COMPUTE 可在明細列後附加彙總行;COMPUTE BY 需搭配 ORDER BY,可產生分組小計。現代開發建議改用 GROUPING SETS、ROLLUP、CUBE 或應用層處理。

最佳實踐小結

  1. SELECT 清單欄位必須「要么在 GROUP BY,要么在彙總函數中」。
  2. 優先使用標準 GROUP BY col1, col2,避免 GROUP BY ALL。
  3. 分組前過濾用 WHERE,分組後過濾用 HAVING。
  4. 大量資料分組前先建立適當索引(覆蓋索引)提升效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved