GROUP BY 是 SQL 聚合分析的基石。它將結果集按一或多個欄位分組,配合 COUNT、SUM、AVG、MAX、MIN 等聚合函數,快速產出統計報表:每日銷售額、各部門人數、用戶登入次數等。
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE condition GROUP BY column_name;
CREATE TABLE employee_tbl (
id INT PRIMARY KEY,
name CHAR(10) NOT NULL DEFAULT '',
date DATETIME NOT NULL,
singin TINYINT NOT NULL DEFAULT 0 COMMENT '登錄次數'
);
INSERT INTO employee_tbl VALUES
('1', '小明', '2016-04-22 15:25:33', '1'),
('2', '小王', '2016-04-20 15:25:47', '3'),
('3', '小麗', '2016-04-19 15:26:02', '2'),
('4', '小王', '2016-04-07 15:26:14', '4'),
('5', '小明', '2016-04-11 15:26:40', '4'),
('6', '小明', '2016-04-04 15:26:54', '2');
mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name; +--------+----------+ | name | COUNT(*) | +--------+----------+ | 小麗 | 1 | | 小明 | 3 | | 小王 | 2 | +--------+----------+
mysql> SELECT name, SUM(singin) AS singin_count
-> FROM employee_tbl GROUP BY name;
+--------+--------------+
| name | singin_count |
+--------+--------------+
| 小麗 | 2 |
| 小明 | 7 |
| 小王 | 7 |
+--------+--------------+
WITH ROLLUP 在分組統計基礎上,自動追加超級聚合行(Grand Total),並對每個分組層級產生小計。
mysql> SELECT name, SUM(singin) AS singin_count
-> FROM employee_tbl GROUP BY name WITH ROLLUP;
+--------+--------------+
| name | singin_count |
+--------+--------------+
| 小麗 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| NULL | 16 |
+--------+--------------+
最後一行 NULL 代表全員總登入次數 16。若按 name, date 雙欄分組,會產生「每人小計」+「總計」兩層級彙總。
mysql> SELECT COALESCE(name, '總數') AS name, SUM(singin) AS singin_count
-> FROM employee_tbl GROUP BY name WITH ROLLUP;
+--------------------------+--------------+
| name | singin_count |
+--------------------------+--------------+
| 小麗 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| 總數 | 16 |
+--------------------------+--------------+
COALESCE(a,b,c...) 返回第一個非 NULL 參數,完美解決報表顯示問題。
INDEX (name, date) 可加速 GROUP BY name, date。掌握 GROUP BY 與 WITH ROLLUP,配合 COALESCE 美化輸出,即可快速產出專業級統計報表,滿足業務多維度分析需求。