MySQL:按两列分组获取所有日期与地点组合的统计结果
原数据表
| Date | Location | sum |
|---|---|---|
| Jun, 1 | Location 1 | 1 |
| Jun, 2 | Location 2 | 1 |
| Jun, 3 | Location 1 | 1 |
目标结果表
| Date | Location | sum |
|---|---|---|
| Jun, 1 | Location 1 | 1 |
| Jun, 1 | Location 2 | 0 |
| Jun, 2 | Location 1 | 0 |
| Jun, 2 | Location 2 | 1 |
| Jun, 3 | Location 1 | 1 |
| Jun, 3 | Location 2 | 0 |
实现方案
可以通过交叉连接生成所有日期-地点组合,再左连接原表补全数据,用COALESCE将空值替换为0,具体SQL语句如下:
SELECT d.Date, l.Location, COALESCE(t.sum, 0) AS sum FROM (SELECT DISTINCT Date FROM your_table) d CROSS JOIN (SELECT DISTINCT Location FROM your_table) l LEFT JOIN your_table t ON d.Date = t.Date AND l.Location = t.Location ORDER BY d.Date, l.Location;
逻辑说明
- 两个子查询分别提取原表中所有唯一的日期和地点;
CROSS JOIN生成日期与地点的所有可能组合;LEFT JOIN关联原表,保留所有组合记录,原表无对应数据时sum字段会返回NULL;COALESCE(t.sum, 0)将NULL替换为0;ORDER BY保证结果按日期、地点排序,与目标表结构一致。
内容的提问来源于stack exchange,提问作者RomVnoff
相关产品推荐
相关产品推荐

