SQL分组查询需求:按id和year求和amt且排除dept=B
解决SQL分组后返回非B部门的问题
原SQL语句的核心问题是:GROUP BY id, year时,SELECT中包含未做聚合处理的dept字段,数据库会随机返回分组内某条记录的dept值,因此才会出现返回B的情况。要确保返回分组内的非B部门,同时保留按id+year统计所有符合条件的amt总和,可按以下方式修改:
修改后的SQL语句
SELECT id, year, MAX(CASE WHEN dept != 'B' THEN dept END) AS dept, SUM(amt) AS total_amt FROM company a WHERE dept IN ('A', 'B') GROUP BY id, year
逻辑说明
- 聚合提取非B部门:通过
CASE WHEN dept != 'B' THEN dept END筛选出分组内的非B部门,再用MAX()聚合函数(若分组内只有一个非B部门,MAX()和MIN()效果一致)固定返回该部门,避免随机值。 - 保留总和统计:
SUM(amt)依然会统计分组内所有A、B部门的amt总和,符合需求。
如果你的业务场景中,同一个id+year分组可能存在多个非B部门,可根据实际需求调整聚合逻辑(例如用STRING_AGG()拼接多个部门,或添加额外条件筛选特定部门)。
内容的提问来源于stack exchange,提问作者Sue_sue
相关产品推荐
相关产品推荐

