Sql 带逻辑/条件的左连接
我的标题有点模棱两可,但我会尝试在下面澄清 我已经创建了一个视图(a)和几个连接。我正在尝试将该视图与另一个视图(B)连接起来。这两个视图都包含一个年份字段、公司ID、行业ID和一个值为I或U的产品代码 视图B还包含员工ID,自然每个公司ID都有多个员工ID。任何员工ID都可以有一个产品代码,即I、U或两者。如果两者都有,则会有两个相同的员工ID,由produc代码识别 现在我想加入一个关于年份、客户ID、行业ID和产品代码的视图。但是,由于视图B中的每个客户ID都可能出现两次(如果该客户的底层员工同时具有产品代码I和U),因此我只想加入一次 这是产品代码的客户ID的分发: 我而不是你:165'370 U而不是I:45'27 U和I:48'920Sql 带逻辑/条件的左连接,sql,sql-server,left-join,Sql,Sql Server,Left Join,我的标题有点模棱两可,但我会尝试在下面澄清 我已经创建了一个视图(a)和几个连接。我正在尝试将该视图与另一个视图(B)连接起来。这两个视图都包含一个年份字段、公司ID、行业ID和一个值为I或U的产品代码 视图B还包含员工ID,自然每个公司ID都有多个员工ID。任何员工ID都可以有一个产品代码,即I、U或两者。如果两者都有,则会有两个相同的员工ID,由produc代码识别 现在我想加入一个关于年份、客户ID、行业ID和产品代码的视图。但是,由于视图B中的每个客户ID都可能出现两次(如果该客户的底层
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/年/行业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
如果我理解正确,请尝试以下方法 [伪代码]
left join ( Select *, rank() over (partition by whatMakesItUnique Order by ProductCode) distinction From tableA ) a
on your conditions + a.distinction = 1
其思想是,如果whatMakesItUnique有两行,则将数字1指定给ProductCode“I”,如果只有一行,则将数字1指定给“U”,然后在此指定的数字上加入
“whatMakesItUnique”在您的情况下可能是年份、客户ID、行业ID。我认为您可以使用outer apply做您想做的事情:
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
这将从
视图返回一行,按产品代码排序。文本太多,数据太少。我看不出你的数据有什么问题,所以我很难帮助你。考虑编辑你的问题,包括说明你的问题的样本数据。请从这两个视图中添加一些示例数据来获得这个期望的结果。这将比你提到的解释更多。你的解释不清楚。根据输入中出现的行,说出所需结果中出现的行。给出可执行示例输入、DDL、视图(如果需要)和所需输出。也适用于您当前的输出。阅读并付诸行动。“我想加入视图A”是什么意思?和B一起?“我只想加入一次”是什么意思?很明显,你并不是说在包括产品在内的栏目中加入A到B;你是说,什么意思?你实际上并没有写清楚你的意思。