SQL左连接left join出现重复值导致sum求和结果翻倍如何解决
问题根因
你遇到的求和翻倍是左连接产生笛卡尔积导致的:
- dataset1中ID=1共2行,dataset2中ID=1也有2行,on条件仅用ID关联时,会生成2*2=4行的中间结果
- 求和是对中间结果的4行计算,自然是预期值的2倍
- sum加distinct的方法不可行,因为会把业务上合法的重复金额直接去重,导致统计不准
解决方案
方案1:先聚合dataset1,再关联去重后的维度表(推荐,性能最高)
先单独统计dataset1的金额汇总,再和仅保留ID、NAME的去重dataset2关联,完全避免笛卡尔积:
proc sql; /* 第一步聚合dataset1的金额 */ create table amt_sum as select id, sum(AMT1) as AMT1, sum(AMT2) as AMT2, sum(AMT3) as AMT3, sum(AMT4) as AMT4 from dataset1 group by id; /* 第二步生成ID-NAME的唯一映射表 */ create table id_name_map as select distinct id, NAME as CUSTNAME from dataset2; /* 第三步关联得到最终结果 */ create table demo as select a.*, b.CUSTNAME from amt_sum a left join id_name_map b on a.id = b.id; quit;
方案2:关联前先对dataset2按ID去重
如果要写在单条SQL里,也可以先对dataset2做子查询去重后再关联:
proc sql; create table demo as select a.id, sum(a.AMT1) as AMT1, sum(a.AMT2) as AMT2, sum(a.AMT3) as AMT3, sum(a.AMT4) as AMT4, max(b.NAME) as CUSTNAME from dataset1 a left join (select distinct id, NAME from dataset2) b on a.id = b.id group by a.id; quit;
两种方案都会得到你预期的输出结果,不会出现求和翻倍的问题,也不会误删合法的重复金额记录。
内容的提问来源于stack exchange,提问作者Alex Dunphy
相关产品推荐
相关产品推荐

