WITH ROLLUP 是 MySQL 對標準 SQL GROUPING SETS 的擴展,能在單次查詢中產生多層級小計與總計,適合報表多維彙總。
表 employee(dep, pos, sal)。
SELECT dep, pos, AVG(sal) FROM employee GROUP BY dep, pos; +------+------+-----------+ | dep | pos | avg(sal) | +------+------+-----------+ | 01 | 01 | 1500.0000 | | 01 | 02 | 1950.0000 | | 02 | 01 | 1500.0000 | | 02 | 02 | 2450.0000 | | 03 | 01 | 2500.0000 | | 03 | 02 | 2550.0000 | +------+------+-----------+
SELECT dep, pos, AVG(sal) FROM employee GROUP BY dep, pos WITH ROLLUP; +------+------+-----------+ | dep | pos | avg(sal) | +------+------+-----------+ | 01 | 01 | 1500.0000 | | 01 | 02 | 1950.0000 | | 01 | NULL | 1725.0000 | <-- 部門 01 小計 | 02 | 01 | 1500.0000 | | 02 | 02 | 2450.0000 | | 02 | NULL | 2133.3333 | <-- 部門 02 小計 | 03 | 01 | 2500.0000 | | 03 | 02 | 2550.0000 | | 03 | NULL | 2533.3333 | <-- 部門 03 小計 | NULL | NULL | 2090.0000 | <-- 總計 +------+------+-----------+
NULL 代表該維度的聚合行(小計/總計)。GROUP BY 字段順序決定:dep, pos → 先按 pos 小計,再按 dep 小計,最後總計。GROUPING(dep)、GROUPING(pos) 區分業務 NULL 與聚合 NULL(MySQL 8.0+ 支援 GROUPING() 函數)。ONLY_FULL_GROUP_BY 下,SELECT 列表非聚合列需包含在 GROUP BY 或為函數依賴列。WITH ROLLUP 不支援 ORDER BY,結果順序固定;若需排序可外層包裹。