SQL聚合函数使用错误排查:AGRISN=1的计算结果异常问题
SQL查询错误排查与修正方案
问题概述
现有MEDCOND和MEDREFUND两张数据表,需计算2000年5月10日每个AGRISN(1、2、3)对应的(REFUNDSUMRUB-PREMRUB)总和。执行原有SQL后,AGRISN=1的sum_结果为2695(预期1985),其余结果正确。
核心排查方向
- 多表关联引发笛卡尔积:若关联仅基于
AGRISN,未限定日期或唯一业务标识,会导致AGRISN=1的记录被重复匹配,最终总和被错误放大。 - 日期过滤不完整:仅在单表中添加日期条件(如仅过滤
MEDREFUND的REFUNDDATE),未同步过滤MEDCOND的对应日期字段,引入了非目标日期的PREMRUB值,影响计算结果。 - 异常数据混入:检查
AGRISN=1的目标日期记录,是否存在空值、异常值或不属于2000-05-10的无效数据。
修正方案示例
方案1:完善关联条件避免笛卡尔积
确保关联时同时匹配AGRISN和日期字段,杜绝重复匹配:
SELECT mc.AGRISN, SUM(mr.REFUNDSUMRUB - mc.PREMRUB) AS sum_ FROM MEDCOND mc INNER JOIN MEDREFUND mr ON mc.AGRISN = mr.AGRISN AND mc.COND_DATE = mr.REFUNDDATE -- 新增日期关联,确保记录一一对应 WHERE mr.REFUNDDATE = '2000-05-10' GROUP BY mc.AGRISN;
方案2:补全双表日期过滤
若采用左/右连接,需同时对两张表的日期进行过滤,避免引入无效数据:
SELECT t.AGRISN, SUM(t.REFUNDSUMRUB - t.PREMRUB) AS sum_ FROM ( SELECT mr.AGRISN, mr.REFUNDSUMRUB, mc.PREMRUB FROM MEDREFUND mr LEFT JOIN MEDCOND mc ON mr.AGRISN = mc.AGRISN WHERE mr.REFUNDDATE = '2000-05-10' AND mc.COND_DATE = '2000-05-10' -- 补全MEDCOND的日期过滤 ) t GROUP BY t.AGRISN;
验证步骤
- 单独查询
AGRISN=1在2000-05-10的所有REFUNDSUMRUB和PREMRUB记录,手动计算总和,确认原始数据是否符合预期。 - 查看关联后的临时结果集,检查是否存在重复计算的记录。
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

