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

MySQL GROUP BY WITH ROLLUP:超級聚合與多維小計

     編輯:MySQL 綜合教學

MySQL GROUP BY WITH ROLLUP:超級聚合與多維小計

WITH ROLLUP 是 MySQL 對標準 SQL GROUPING SETS 的擴展,能在單次查詢中產生多層級小計與總計,適合報表多維彙總。

範例:部門-職位薪資平均

表 employee(dep, pos, sal)。

1. 普通 GROUP BY

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 |
+------+------+-----------+

2. 加上 WITH ROLLUP

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() 函數)。

應用場景

  • 財務報表:區域→省份→城市多級小計。
  • 銷售儀表板:品類→品牌→SKU 鑽取彙總。
  • 避免多次查詢或應用層計算,減少網絡往返。

注意

  • MySQL 5.7+ 默認 ONLY_FULL_GROUP_BY 下,SELECT 列表非聚合列需包含在 GROUP BY 或為函數依賴列。
  • WITH ROLLUP 不支援 ORDER BY,結果順序固定;若需排序可外層包裹。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved