左连接逻辑/条件

时间:2017-12-21 10:50:06

标签: sql sql-server left-join

我的头衔有点暧昧,但我会尝试在下面澄清。

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

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

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

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

我而不是U:165' 370

U而不是我: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' 

这是我目前正在运行的联接,虽然我排除了所有客户ID仅包含产品代码U的记录。我想每个客户ID /年/行业ID只加入一次是因为我后来在视图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

2 个答案:

答案 0 :(得分: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”可能是您的案例中的年份,客户ID,IndustyID。

答案 1 :(得分: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返回一行,按产品代码优先排序。