【问题标题】:Left join and indicator matching左连接和指标匹配
【发布时间】:2021-04-20 01:39:57
【问题描述】:

所以我是 sql 新手,我需要一些编码帮助。 这是我的桌子

   Table_A      
Customer ID_2019    
   A       600  
   A       697
   A       932  



   Table_B      
Customer ID_2018    
   A       600  
   A       697  

这是我将两个表合并在一起时的代码 --合并结果

select a.*,b.id_2018 into #temp
from Table_A as a left join Table_B as b
on a.customer=b.customer;

这是我的结果:

Results 
Customer ID_2019  ID_2018
918      600        600
918      600        697
918      697        600
918      697        697
918      932        600
918      932        697

Here are the results that I desire:
--Desired Results       
Customer   ID_2019  ID_2018
918          600     600
918          697     697
918          932      -

我想将客户的 ID_2019 和 ID_2018 合并在一起;对于第三个 ID_2019 (932),我希望 ID_2018 有一个空白或破折号。

--我想在上面放一个指示器,看看 ID_2019 是否与 ID_2018 匹配,并创建一个 1 或 0 的新变量。

--drop table #match_nomatch;
select *,
case when ID_2019=ID_2018 then 1 else 0 end as Match into #Match_NoMatch
from #temp
group by customer, ID_2019, ID_2018;

这是我的结果:

--The results for ID_2018 are repeating the same 2 id's over again  
Customer  ID_2019   ID_2018 Match
918         600      600    1
918         600      697    0
918         697      600    0
918         697      697    1
918         932      600    0
918         932      697    0

这是我想要的结果:

Desired Results         
Customer ID_2019    ID_2018 Match
918      600         600    1
918      697         697    1
918      932           -    0

对于上面的代码,如果 ID_2019 和 ID_2018 匹配,则输入 1,否则输入 0。对于第三个 Id_2019,我希望 ID_2018 为空白或破折号。

任何帮助将不胜感激。

【问题讨论】:

  • 如果 id_2019 不存在但 id_2018 存在怎么办?您是否只希望结果中包含 2019 年的所有 id?
  • 没有。如果信息在 ID_2018 或 ID_2019 中均不存在,我想要空格或破折号。

标签: sql left-join matching indicator


【解决方案1】:

您需要一个用于连接的列来分配行号。你没有,所以你可以发明一个:

select a.*, b.id_2018
into #temp
from (select a.*, row_number() over (order by id) as seqnum
      from Table_A a
     ) a left join
     (select b.*, row_number() over (order by id) as seqnum
      from Table_B b
     ) b
     on a.customer = b.customer and a.seqnum = b.seqnum;

【讨论】:

    【解决方案2】:

    您可以使用full outer join 使用customer, id_2018 and id_2019,如下所示:

    select coalesce(a.customer,b.customer) as customer, 
           a.id_2019, b.id_2018 
      into #temp
      from Table_A as a full join Table_B as b
        on a.customer=b.customer and a.id_2019 = b.id_2018; 
    

    【讨论】:

    • 是的!这太棒了!谢谢。
    • 您可以接受您认为正确的答案,以便将该问题标记为已解决
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多