【问题标题】:duplicate values in left join - sql左连接中的重复值 - sql
【发布时间】:2021-12-07 21:05:30
【问题描述】:

我有 2 个数据集:

dataset 1:
AMT1    AMT2    AMT3    AMT4    ID
245    955       0      955     1
245     0       245     245     1

dataset 2:
AMT1    AMT2    AMT3    AMT4    ID NAME
245    955       0      955     1  AMY
245     0       245     245     1  AMY


JOIN:

    proc sql;
    create table demo as
    select distinct a.id,
    sum(a.amT1) as exp1,
   sum(a.amT2) as exp2,
   sum(a.amT3) as exp3,
   sum(a.amT4) as exp4,
   MAX(name) as name
    from dataset1 a
    left join dataset2 b
    on a.id = b.id
    group by 1;
    quit;

输出:预期

ID  AMT1    AMT2    AMT3    AMT4    CUSTNAME
1   490     955     245    1200    AMY

问题: 1)n 左连接,即使我没有从 dataset2 获取数量值,它们也会被求和,输出是预期值的两倍。例如:amt 4 值变为 2400 而不是 1200。 2)如果我在 sum 中使用 distinct 函数;整行具有相同值的场景将被删除。

我该如何解决这个问题?

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于 SQL 包括 DDL 和表格初始化代码。当你得到一个你不期望的结果时,暂停你的总体目标,切到第一个具有意外结果的子表达式并说出你的期望和原因,并通过文档证明是合理的。 How to AskHelp center
  • 这似乎是一个常见的错误,人们想要一些连接,每个可能涉及不同的键,一些子查询,每个可能涉及连接和/或聚合,但他们错误地尝试执行所有然后加入所有聚合或聚合以前的聚合。在适当的行上编写单独的聚合子查询和/或聚合(可能是不同的)案例语句选择连接行;然后将子查询连接在一起。 Two SQL LEFT JOINS produce incorrect result
  • 请在考虑发布之前阅读手册和谷歌任何错误消息和许多清晰、简洁和精确的措辞,包括和不包括您的特定名称/字符串/数字,'网站: stackoverflow.com' & 标签;阅读许多答案。反映你的研究。请参阅How to AskHelp center 和投票箭头鼠标悬停文本。如果您发布问题,请使用一个措辞作为标题。
  • 样本数据不佳。您至少应该有一个 ID 值,它只存在于其中一张表中。

标签: sql join sas left-join


【解决方案1】:
  1. 您需要获取唯一的 id 和 name 以避免结果重复
  2. 对于条件 d1.id=d2.id,您有多个匹配项,因此您有重复项
  3. 在下面的解决方案中,我使用了子选择来获取唯一值 cust_name as ( select id, name from dataset2 group by id, name )
  4. 您可以使用 with 子句 https://www.geeksforgeeks.org/sql-with-clause/ 将示例数据存储在子选择中
with 
  dataset1 as (
    select 245 as amt1, 955 as  amt2,  0   amt3 ,  955 amt4 ,  1 id  union all
    select 245 as amt1, 0 as    amt2,  245 amt3 ,  245 amt4 ,  1 id 
)
, dataset2 as (
    select 245 as amt1, 955 as  amt2,  0   amt3 ,  955 amt4 ,  1 id , 'AMY' name  union all
    select 245 as amt1, 0 as    amt2,  245 amt3 ,  245 amt4 ,  1 id , 'AMY' name
)
, cust_name as (
    select id, name from dataset2 group by id, name
)
select 
     c.id
    ,sum(d1.amt1) amt1
    ,sum(d1.amt2) amt2
    ,sum(d1.amt3) amt3
    ,sum(d1.amt4) amt4
    ,c.name
from 
    dataset1 d1
left join
    cust_name c
on d1.id=c.id   

在这里你可以测试这个 sql : https://www.jdoodle.com/execute-sql-online/

  1. 这里你不需要加入,你可以从 1 个表中获取所有信息
with 
 dataset2 as (
    select 245 as amt1, 955 as  amt2,  0   amt3 ,  955 amt4 ,  1 id , 'AMY' name  union all
    select 245 as amt1, 0 as    amt2,  245 amt3 ,  245 amt4 ,  1 id , 'AMY' name
)
select 
     d2.id
    ,sum(d2.amt1) amt1
    ,sum(d2.amt2) amt2
    ,sum(d2.amt3) amt3
    ,sum(d2.amt4) amt4
    ,d2.name
from 
    dataset2 d2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 2017-07-02
    • 2021-10-25
    • 1970-01-01
    • 2013-03-02
    • 2014-07-21
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多