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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:54:00