连接含重复行数据的表时如何获取正确的SUM()聚合计算结果
需求说明
现有3张业务表,结构如下:
Users表:存储用户信息,包含id、user_name字段listings表:存储条目信息,包含refno、agent_id字段logs表:存储操作日志,包含refno、status字段
需要统计logs表中各状态的条目数量,同时关联展示对应用户的姓名,期望输出格式如下:
| Draft | Publish | Name |
|---|---|---|
| 1 | 1 | Jason |
| 0 | 1 | Jam |
现有问题
目前编写的SQL语句执行后结果不符合预期:
select SUM(CASE WHEN status = 'Draft' THEN 1 END) AS draft, SUM(CASE WHEN status = 'Publish' THEN 1 END) AS publish, u.name from logs t inner join listings l on t.refno = l.refno inner join users u on l.agent_id=u.id
修正方案
错误原因
- 缺少分组逻辑:使用
SUM()聚合函数时未指定分组维度,SQL会默认将所有匹配结果聚合为一行,无法按用户维度拆分统计结果 - 空值未兼容:原
CASE语句未设置ELSE分支,当对应用户无对应状态的日志时,统计结果会返回NULL而非期望的0 - 字段名不匹配:
Users表存储用户姓名字段为user_name,原语句中调用u.name会触发字段不存在报错
修正后SQL
SELECT SUM(CASE WHEN t.status = 'Draft' THEN 1 ELSE 0 END) AS Draft, SUM(CASE WHEN t.status = 'Publish' THEN 1 ELSE 0 END) AS Publish, u.user_name AS Name FROM logs t INNER JOIN listings l ON t.refno = l.refno INNER JOIN Users u ON l.agent_id = u.id GROUP BY u.id, u.user_name
内容的提问来源于stack exchange,提问作者user17071484
相关产品推荐
相关产品推荐

