SQL按id分组求和结果远大于预期值,该如何排查?
问题分析与解决方案
核心问题
你的SQL存在两个导致结果偏大的关键错误:
- 多余关联引发重复计算:你将原始
bh表和CTE结果accV按id关联时,同一个id在bh表中有多少条原始记录,accV中对应id的单条value就会被重复匹配多少次,求和时就会被累加多少次,最终结果自然远大于真实值。以你给出的示例数据为例:id=1在bh表有2条记录,accV中id=1的value为300,关联后会生成2行value=300的记录,求和后得到600,是正确值的2倍。 - CTE逻辑与需求不匹配:你需要的是按
id对value求和,但CTE中你使用了max(a_value)取最大值,逻辑完全不符合需求;且你group by字段包含了d_id,会导致同id不同d_id的记录被拆分成多个组,也会干扰最终结果。
正确SQL写法
如果你的需求是统计2021-06-30当天各id对应的value总和,不需要写CTE和关联,直接单表分组聚合即可:
SELECT id, SUM(a_value) AS value FROM bh WHERE period_end_date = '2021-6-30' GROUP BY id
如果确实需要先从CTE中做前置计算再求和,也不需要再次关联原始bh表,直接对CTE结果分组即可:
;with accV as ( SELECT d_id, [period_end_date], -- 按实际需求选择聚合函数,求和用SUM、取最大值用MAX SUM(a_value) as value, id FROM bh where period_end_date = '2021-6-30' group by d_id, period_end_date, id ) SELECT id, sum(value) FROM accV group by id
内容的提问来源于stack exchange,提问作者goolius_boozler
相关产品推荐
相关产品推荐

