MS Access/SQL多表关联计算求助:3表按Policy匹配求和取差
解决MS Access中多表关联求和及缺失值处理问题
你遇到的核心问题是内连接会过滤掉C表中无对应记录的A+B匹配项——因为内连接要求三个表的关联条件同时满足,当C没有对应前4位保单号的记录时,整条匹配会被排除,导致无法计算这些场景下的差值(需求要求此时返回0)。
正确思路:分阶段汇总,避免缺失值丢失与重复计算
- 先单独汇总每个A表Policy对应的B表Value总和(只保留A和B匹配的记录)
- 再单独汇总每个A表Policy对应的C表Value总和,无对应记录时用
Nz()函数返回0 - 最后关联两个汇总结果,计算差值并取下限0,再求和得到最终的Final值
完整SQL语句
SELECT Sum(IIf(SubB.TotalB - SubC.TotalC > 0, SubB.TotalB - SubC.TotalC, 0)) AS Final FROM ( -- 子查询:获取A与B匹配的每个Policy对应的B值总和 SELECT A.Policy, Sum(B.Value) AS TotalB FROM A INNER JOIN B ON Left(B.Policy, 4) = A.Policy GROUP BY A.Policy ) AS SubB INNER JOIN ( -- 子查询:获取每个A的Policy对应的C值总和,无匹配则返回0 SELECT A.Policy, Nz(Sum(C.Value), 0) AS TotalC FROM A LEFT JOIN C ON Left(C.Policy, 4) = A.Policy GROUP BY A.Policy ) AS SubC ON SubB.Policy = SubC.Policy
关键细节解释
LEFT JOIN关联A和C:确保即使C中没有对应前4位保单号的记录,A表的Policy依然会被保留,不会丢失数据Nz(Sum(C.Value), 0):把无匹配时Sum(C.Value)产生的Null值转换成0,完美贴合“不存在则返回0”的需求- 先按Policy分别汇总:避免直接多表连接产生笛卡尔积(导致求和值被重复计算),保证结果准确性
IIf()函数处理差值下限:当B的总和小于等于C的总和时,取0作为该Policy的差值,再求和得到最终Final数值
内容的提问来源于stack exchange,提问作者user140511
相关产品推荐
相关产品推荐

