列等于值的SQL连接

时间:2018-12-13 22:11:11

标签: sql

我只用SQL完成了一些代码课程(即,这是超级新手),但是我在应用程序中使用它,并且很难弄清楚它是如何翻译的。

我正在尝试在[1] .DEPCD等于[2] .DEPCD的情况下进行联接,但是我希望它将'DEPCD的100和200视为可互换。

此代码部分有效:

[1].EMPLID=[2].EMPLID AND 
[1].DEPCD in ('100', '200') AND [2].DEPCD in ('100', '200')

这对它的另一部分有效:

[1].EMPLID=[2].EMPLID AND 
[1].DEPCD = [2].DEPCD

在键入此内容时,请考虑一下,也许可以(?):

[1].EMPLID=[2].EMPLID AND 
(([1].DEPCD in ('100', '200') AND [2].DEPCD in ('100', '200')) OR
([1].DEPCD not in ('100', '200') AND [2].DEPCD not in ('100', '200')) AND
[1].DEPCD = [2].DEPCD)

它接受语法,但这似乎草率。什么是干净的方法?

表格示例

[1]
EMPLD | DEPCD | NAME
101   | 100   | Todd
101   | 200   | Todd
101   | 300   | Todd

[2]
EMPLD | DEPCD | AMOUNT
101   | 100   | 25
101   | 200   | 35
101   | 300   | 50

报告示例:

EMPLD | DESCRIPTION | NAME | AMOUNT
101   | 100 + 200   | Todd | 60
101   | 300         | Todd | 50

“描述”列来自我在其中结合了100和200的字段。

1 个答案:

答案 0 :(得分:3)

虽然我不确定100%给出示例数据和预期结果的情况,但整个查询的外观如何,这是将aggregationcase结合使用的一种选择:

select t1.empld, 
    t1.name, 
    case when t1.depcd in (100,200) then '100 + 200' 
         else cast(t1.depcd as varchar(100)) 
    end as description,
    sum(t2.amount) as amount
from t1 
    join t2 on t1.empld = t2.empld and t1.depcd = t2.depcd
group by t1.empld, 
    t1.name, 
    case when t1.depcd in (100,200) then '100 + 200' 
         else cast(t1.depcd as varchar(100)) 
    end