[英]SQL: How to use CASE in join
这是我正在尝试使用的代码
SELECT
TData.dtContractDate,
TData.chPurchase,
TData.nShipperID,
TData.nSourceSiteId,
Vendor.chShipperName,
Vendor.chCity,
Vendor.chState,
Vendor.chCountry,
Vendor.chZip
FROM Data1.dbo.TData TData
JOIN Data1.dbo.Vendor
ON Vendor.nShipperId = TData.nShipperID
AND Vendor.nCompanyCode = (CASE WHEN Vendor.nCompanyCode = '2' THEN '2' ELSE '26' END)
WHERE (TData.nCompanyCode=2) AND (TData.dtContractDate > '" 04/23/2015 12:01:00 AM')
我正在尝试加入这两个表,但是如果
ncompanycode = 2 AND Vendor.nShipperId = TData.nShipperID
,
那我想拉那些数据,如果这个不存在,那我想用
ncompanycode = 26 and Vendor.nShipperId = TData.nShipperID
。
现在,我得到了两家公司拥有的所有shipperID
副本。
这是虚拟表以及我得到的结果,我不希望chPurchase重复。
TData表
| dtContractDate | chPurchase | nShipperID | nSourceSiteId | nCompanyCode |
|---------------------------|------------|------------|---------------|--------------|
| January, 04 2015 00:00:00 | 2547635 | 453 | 68686868 | 2 |
| January, 05 2015 00:00:00 | 2547636 | 453 | 68686868 | 2 |
| January, 06 2015 00:00:00 | 2547637 | 454 | 68686868 | 2 |
| January, 07 2015 00:00:00 | 2547638 | 454 | 68686868 | 2 |
| January, 08 2015 00:00:00 | 2547639 | 455 | 68686868 | 2 |
| January, 09 2015 00:00:00 | 2547640 | 456 | 68686868 | 2 |
供应商表
| nCompanyCode | nShipperID | chShipperName | chCity | chState | chCountry | chZip |
|--------------|------------|---------------|--------|---------|-----------|--------|
| 2 | 453 | Name1 | Dallas | TX | US | 666555 |
| 26 | 453 | Name2 | Dallas | TX | US | 666556 |
| 2 | 454 | Name3 | Dallas | TX | US | 666557 |
| 26 | 455 | Name4 | Dallas | TX | US | 666558 |
| 2 | 455 | Name5 | Dallas | TX | US | 666559 |
| 26 | 456 | Name6 | Dallas | TX | US | 666560 |
结果表
| dtContractDate | chPurchase | nShipperID | nSourceSiteId | nCompanyCode | chShipperName | chCity | chState | chCountry | chZip |
|------------------|------------|------------|---------------|--------------|---------------|--------|---------|-----------|--------|
| January, 04 2015 | 2547635 | 453 | 68686868 | 26 | Name2 | Dallas | TX | US | 666555 |
| January, 04 2015 | 2547635 | 453 | 68686868 | 2 | Name1 | Dallas | TX | US | 666555 |
| January, 05 2015 | 2547636 | 453 | 68686868 | 26 | Name1 | Dallas | TX | US | 666556 |
| January, 05 2015 | 2547636 | 453 | 68686868 | 2 | Name2 | Dallas | TX | US | 666556 |
| January, 06 2015 | 2547637 | 454 | 68686868 | 2 | Name3 | Dallas | TX | US | 666557 |
| January, 07 2015 | 2547638 | 454 | 68686868 | 2 | Name3 | Dallas | TX | US | 666558 |
| January, 08 2015 | 2547639 | 455 | 68686868 | 2 | Name5 | Dallas | TX | US | 666559 |
| January, 08 2015 | 2547639 | 455 | 68686868 | 26 | Name5 | Dallas | TX | US | 666559 |
| January, 09 2015 | 2547640 | 456 | 68686868 | 26 | Name6 | Dallas | TX | US | 666560 |
此解决方案不使用CASE
但使用COALESCE
在更干净的条件下产生期望的结果。
为了缩短可读性,我已经缩短了表别名。
我还注释了涉及日期的WHERE子句,因为:
SQL代码使用两个LEFT JOINs
并使用COALESCE
选择在SELECT
输出中使用哪个。 当第一个JOIN
( V
)结果为NULL
,输出求助于V2
。 V2
JOIN
明确要求nCompanyCode
为26
,但是如果存在多个替代nCompanyCodes
则可以根据需要添加或删除任何条件。
查询:
SELECT
T.dtContractDate
,T.chPurchase
,T.nShipperID
,T.nSourceSiteId
,COALESCE(V.chShipperName,V2.chShipperName) chShipperName
,COALESCE(V.chCity,V2.chCity) chCity
,COALESCE(V.chState, V2.chState) chState
,COALESCE(V.chCountry,V2.chCountry) chCountry
,COALESCE(V.chZip,V2.chZip) chZip
-- Added to show what Vendor company code is being used
,COALESCE(V.nCompanyCode,V2.nCompanyCode) nCompanyCode
FROM TData T
LEFT JOIN Vendor V
ON V.nShipperId = T.nShipperID
AND V.nCompanyCode = T.nCompanyCode
LEFT JOIN Vendor V2
ON V2.nShipperId = T.nShipperID
AND V2.nCompanyCode <> T.nCompanyCode
AND V2.nCompanyCode = 26
-- Commented out this WHERE clause because it eliminates all rows
-- WHERE T.dtContractDate > '04/23/2015 12:01:00 AM'
样本输出:
| dtContractDate | chPurchase | nShipperID | nSourceSiteId | chShipperName | chCity | chState | chCountry | chZip | nCompanyCode |
|------------------|------------|------------|---------------|---------------|--------|---------|-----------|--------|--------------|
| January, 04 2015 | 2547635 | 453 | 68686868 | Name1 | Dallas | TX | US | 666555 | 2 |
| January, 05 2015 | 2547636 | 453 | 68686868 | Name1 | Dallas | TX | US | 666555 | 2 |
| January, 06 2015 | 2547637 | 454 | 68686868 | Name3 | Dallas | TX | US | 666557 | 2 |
| January, 07 2015 | 2547638 | 454 | 68686868 | Name3 | Dallas | TX | US | 666557 | 2 |
| January, 08 2015 | 2547639 | 455 | 68686868 | Name5 | Dallas | TX | US | 666559 | 2 |
| January, 09 2015 | 2547640 | 456 | 68686868 | Name6 | Dallas | TX | US | 666560 | 26 |
你可以用SQLFiddle在这个例子中发挥这里 。
我认为您想要的是将两个托运人ID相等的表连接起来,然后从该集合中选择公司代码等于您想要的值的所有行。 另外,似乎您不希望WHERE (TData.nCompanyCode=2)
条件,因为您已经在尝试选择公司代码在2或26以上的位置。 尝试这个:
SELECT TData.dtContractDate, TData.chPurchase, TData.nShipperID,
TData.nSourceSiteId, Vendor.chShipperName, Vendor.chCity,
Vendor.chState, Vendor.chCountry, Vendor.chZip
FROM Data1.dbo.TData TData
Join Data1.dbo.Vendor on Vendor.nShipperId = TData.nShipperID
WHERE Vendor.nCompanyCode = (case when Vendor.nCompanyCode = '2' then
'2' else '26' end)
AND (TData.dtContractDate > '" 04/23/2015
12:01:00 AM')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.