用一个简单的奶茶店销售表来说明:
原始数据tea_sales
| date | shop | drink | amount |
|---|---|---|---|
| 0301 | 北京店 | 奶茶 | 3 |
| 0301 | 北京店 | 咖啡 | 2 |
| 0301 | 上海店 | 奶茶 | 5 |
| 0301 | 上海店 | 咖啡 | 1 |
| 0302 | 北京店 | 奶茶 | 4 |
| 0302 | 北京店 | 咖啡 | 6 |
| 0302 | 上海店 | 奶茶 | 2 |
| 0302 | 上海店 | 咖啡 | 3 |
1. GROUP BY 一个字段
SELECT date, SUM(amount) AS total
FROM tea_sales
GROUP BY date| date | total |
|---|---|
| 0301 | 11 |
| 0302 | 15 |
把所有行按天合并,每天一行
2. GROUP BY 两个字段
SELECT date, shop, SUM(amount) AS total
FROM tea_sales
GROUP BY date, shop| date | shop | total |
|---|---|---|
| 0301 | 北京店 | 5 |
| 0301 | 上海店 | 6 |
| 0302 | 北京店 | 10 |
| 0302 | 上海店 | 5 |
按 (天, 店) 组合合并,每个组合一行。只有两个字段都一样才合并。
3. GROUP BY 三个字段
SELECT date, shop, drink, SUM(amount) AS total
FROM tea_sales
GROUP BY date, shop, drink| date | shop | drink | total |
|---|---|---|---|
| 0301 | 北京店 | 奶茶 | 3 |
| 0301 | 北京店 | 咖啡 | 2 |
| 0301 | 上海店 | 奶茶 | 5 |
| 0301 | 上海店 | 咖啡 | 1 |
| 0302 | 北京店 | 奶茶 | 4 |
| 0302 | 北京店 | 咖啡 | 6 |
| 0302 | 上海店 | 奶茶 | 2 |
| 0302 | 上海店 | 咖啡 | 3 |
按 (天, 店, 饮品) 组合合并,和原始数据一样了(因为每个组合本来就只有一行)
核心理解
GROUP BY A → A 相同的行合成一组
GROUP BY A, B → A和B 都相同的行合成一组
GROUP BY A, B, C → A、B、C 都相同的行合成一组字段越多,分组越细,结果行数越多。就像:
- 按天看 → 粗粒度
- 按天 + 店看 → 中粒度
- 按天 + 店 + 饮品看 → 细粒度
更新: 2026-03-06 11:29:10
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/gb23vkikcohc0wv1