You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

验证步骤

  1. 单独查询AGRISN=1在2000-05-10的所有REFUNDSUMRUB和PREMRUB记录,手动计算总和,确认原始数据是否符合预期。
  2. 查看关联后的临时结果集,检查是否存在重复计算的记录。

内容的提问来源于stack exchange,提问作者Mary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:27:20