左连接逻辑/条件

问题描述 投票:0回答:2

我的标题有点含糊不清,但我会在下面澄清一下。

我创建了一个带有几个连接的视图(A)。我试图用另一种观点(B)加入这种观点。两个视图都包含年份字段,公司ID,行业ID和a,我们称之为产品代码,其值为I或U.

视图B还包含员工ID,每个公司ID都有多个员工ID。任何员工ID都可以包含I,U或两者的产品代码。如果两者都有,那么将有2个相同的员工ID由产品代码排除。

现在我想加入关于年份,客户ID,行业ID和产品代码的视图A.但是,由于视图B中的每个客户ID都可能发生两次(如果该客户的基础员工同时拥有产品代码I和U),我只想加入一次。

这是产品代码的客户ID分布:

我和不是你:165'370

你不是我:45'27

你和我:48'920

left join [raw].[ViewA] a on a.year=b.year and a.CustomerID=b.CustomerID
and a.IndustryID=b.IndustryID and a.ProductCode ='I' 

这是我目前正在运行的连接,虽然我排除了所有只有CustomerID只有产品代码U的记录。我之所以想要每个客户ID /年/ IndustryID只加入一次是因为我以后聚合View A中的其他一些值。因此,我不能让该值出现两次。

目前的结果

Year CustomerID IndustyID ProductCode Value
2015    A         Z           I         50
2015    A         Z           U         NULL
2015    B         Z           I         40
2016    A         Z           I         20
2016    B         Z           U         NULL

我想要什么

Year CustomerID IndustyID ProductCode Value
2015    A         Z           I         50
2015    A         Z           U         NULL
2015    B         Z           I         40
2016    A         Z           I         20
2016    B         Z           U         30
sql sql-server left-join
2个回答
1
投票

如果我理解正确,请尝试以下内容

[伪]

left join ( Select *, rank() over (partition by whatMakesItUnique Order by ProductCode) distinction From tableA ) a
    on your conditions + a.distinction = 1

如果whatCakesItUnique为ProductCode“I”有2行,或者只有一行,则为“U”分配数字1,然后加入此分配的数字

“whatMakesItUnique”可能是您的案例中的Year,CustomerID,IndustyID列。


0
投票

我认为你可以通过外部申请做你想做的事:

outer apply
(select top (1) a.*
 from [raw].[ViewA] a 
 where a.year = b.year and a.CustomerID = b.CustomerID and
       a.IndustryID = b.IndustryID 
 order by (case a.ProductCode when 'I' then 1 when 'U' then 2 else 3 end)
) a

这将从ViewA返回一行,按产品代码排列优先顺序。

© www.soinside.com 2019 - 2024. All rights reserved.