多种条件下的 LEFT OUTER JOIN

Pwe*_*hee 2 sql-server sql-server-2012

有没有办法按顺序链接两个表?

表 A(实际):

EX  STATUS  DLV     Actual FEE    Expected Fee
N    ACT    MAIL    1.25
N    ACT    EMAIL   1.25
N    ACT    PICKUP  0
N    NON    MAIL    0
N    NON    EMAIL   1.25
N    NON    PICKUP  0
Y                   0
Run Code Online (Sandbox Code Playgroud)

表 B(预期):

EX  STATUS  DLV     Expected FEE
N    ACT    MAIL    1.25
N    ACT    EMAIL   0
N    ACT    PICKUP  0
N    NON    MAIL    1.25
N    NON    EMAIL   0
N    NON    PICKUP  0
Y                   0
Run Code Online (Sandbox Code Playgroud)

表 A(预期结果):

EX  STATUS  DLV     Actual FEE    Expected Fee
N    ACT    MAIL    1.25          1.25
N    ACT    EMAIL   1.25          0
N    ACT    PICKUP  0             0
N    NON    MAIL    0             1.25
N    NON    EMAIL   1.25          0
N    NON    PICKUP  0             0
Y                   0             0
Run Code Online (Sandbox Code Playgroud)

我想在联接中合并以下逻辑:A.EX = B.EX(首先联接)

然后是其他 3 个的组合,因为它们是独一无二的。

我尝试了这个,但当然没用:

FROM
dbo.claims a
left outer join dbo.pricing p on a.EX = p.EX 
and a.STATUS = p.STATUS
and a.DLV = p.DLV 
Run Code Online (Sandbox Code Playgroud)

我希望将表 B 链接到表 A 以获得预期的费用。如果Ex = Y,则无论状态或DLV如何,它都是0。如果 Ex=N,那么我必须依赖其他两列。

如果这令人困惑,我很抱歉。

McN*_*ets 6

create table tableA (EX char(1), STATUS char(3), DLV varchar(10), Actual_FEE decimal(18,2));
insert into tableA values
('N', 'ACT', 'MAIL',   1.25),
('N', 'ACT', 'EMAIL',  1.25),
('N', 'ACT', 'PICKUP', 0),
('N', 'NON', 'MAIL',   0),
('N', 'NON', 'EMAIL',  1.25),
('N', 'NON', 'PICKUP', 0),
('Y', null,  null,     0);
GO
Run Code Online (Sandbox Code Playgroud)
7 行受影响
create table tableB (EX char(1), STATUS char(3), DLV varchar(10), Expected_FEE decimal(18,2));
insert into tableB values
('N', 'ACT', 'MAIL',   1.25),
('N', 'ACT', 'EMAIL',  0),
('N', 'ACT', 'PICKUP', 0),
('N', 'NON', 'MAIL',   1.25),
('N', 'NON', 'EMAIL',  0),
('N', 'NON', 'PICKUP', 0),
('Y', null,  null,     0);
GO
Run Code Online (Sandbox Code Playgroud)
7 行受影响

根据您的预期结果,它可能是:

select    a.EX, a.STATUS, a.DLV, a.Actual_FEE, b.Expected_FEE
from      tableA a
left join (select distinct EX, STATUS, DLV, Expected_Fee
           from   tableB) b
on        a.EX = b.EX
and       (a.STATUS = b.STATUS OR b.STATUS IS NULL)
and       (a.DLV = b.DLV or b.DLV IS NULL)
GO
Run Code Online (Sandbox Code Playgroud)
前 | 状态 | DLV | 实际费用 | 预期_FEE
:- | :----- | :-----| :--------- | :------------
尼 | 行动 | 邮件 | 1.25 | 1.25 1.25        
尼 | 行动 | 电子邮件 | 1.25 | 1.25 0.00        
尼 | 行动 | 皮卡 | 0.00 | 0.00 0.00        
尼 | 非| 邮件 | 0.00 | 0.00 1.25        
尼 | 非| 电子邮件 | 1.25 | 1.25 0.00        
尼 | 非| 皮卡 | 0.00 | 0.00 0.00        
是 |    |    | 0.00 | 0.00 0.00        

dbfiddle在这里