如何筛选最大日期并求和?WHERE条件为NULL时SUM结果异常修复
问题修复方案
核心问题分析
- 连接类型不当:原SQL用内连接,会自动排除
"Latest Thank You Note"表中无记录的捐赠人;当该表中MAX(Note Written)为NULL时,WHERE条件的OR会引入该捐赠人的全部捐赠记录,但表关联可能产生重复行,导致SUM计算失真。 - 求和逻辑不精准:直接使用
SUM(DE."Amount")无法区分“无致谢信时累加全部金额”和“有致谢信时累加指定日期后金额”两种场景,导致NULL场景下计算错误。
修正后的SQL语句
SELECT DE."Donor First Name", DE."Donor Last Name", EX."SUM(Amount)", No."MAX(Note Written)", -- 条件求和:无致谢信则累加全部金额,否则累加指定日期后的金额 SUM(CASE WHEN No."MAX(Note Written)" IS NULL THEN DE."Amount" WHEN DE."Date" >= No."MAX(Note Written)" THEN DE."Amount" ELSE 0 END) AS "Post-Note Donation Total" FROM "Over 250 - Donors List" AS EX -- 左连接确保所有目标捐赠人都被保留,即使无致谢信记录 LEFT JOIN "Latest Thank You Note" AS No ON EX."Donor Name" = No."Full Name" LEFT JOIN "Donor Table" AS DE ON EX."Donor Name" = DE."Full Name" -- 用字段名称分组,避免依赖位置索引引发的潜在问题 GROUP BY DE."Donor First Name", DE."Donor Last Name", EX."SUM(Amount)", No."MAX(Note Written)"
关键修复说明
- 左连接替代内连接:以捐赠人列表为主表,左连接另外两张表,确保所有需要统计的捐赠人都能出现在结果中,不会因无致谢信记录被过滤。
- 条件聚合控制求和:通过
CASE语句精准定义不同场景下的金额累加规则,避免WHERE条件过滤导致的记录异常。 - 明确分组字段:替换原有的位置索引分组为字段名称,提升SQL可读性和维护性,避免字段顺序变更引发的错误。
内容的提问来源于stack exchange,提问作者Takmandin
相关产品推荐
相关产品推荐

