我有2个临时表
tempA:
attr1 | attr2 | attr3 | expense
ab bc 8967 4567
ab bc 4543 922.65
ab bc 3476 7878.2
tempB
attr4 | attr5 | attr6 | revenue
ab bc 8967 25.1
ab bc 4543 25.2
ab bc 3476 25.3
ab bc 8967 25.4
ab bc 3476 25.5
我有第三个临时表#tempC 该表是基于#tempA和#tempB表构建的。
我面临的问题是#tempC正在存储以下内容:
attr1 | attr5 | revenue | expense
ab bc 25.1 4567
ab bc 25.2 922.65
ab bc 25.3 7878.2
ab bc 25.4 4567
ab bc 25.5 7878.2
每当attr3之间存在匹配项时,分配费用 和attr6(在首次匹配时就应该这样做)
所以我需要#tempC
attr1 | attr5 | revenue | expense
ab bc 25.1 4567
ab bc 25.2 922.65
ab bc 25.3 7878.2
ab bc 25.4 0
ab bc 25.5 0
在这种情况下,如果attr3和attr6之间再次匹配 它应该存储0。
我该怎么解决。
(attr3和attr6是varchar,它们不是pk,或者fk只是简单的属性)
答案 0 :(得分:0)
您可以在下面的查询中使用所需的输出。借助窗口功能,我们可以轻松实现此目标。
create table #tempA (attr1 VARCHAR(10), attr2 VARCHAR(10), attr3 VARCHAR(10), expense NUMERIC(18,2))
create table #tempB (attr4 VARCHAR(10), attr5 VARCHAR(10), attr6 VARCHAR(10), revenue NUMERIC(18,2))
INSERT INTO #tempA
VALUES('ab', 'bc', '8967', 4567),
('ab', 'bc', '4543', 922.65),
('ab', 'bc', '3476', 7878.2)
INSERT INTO #tempB
VALUES('ab', 'bc', '8967', 25.1),
('ab', 'bc', '4543', 25.2),
('ab', 'bc', '3476', 25.3),
('ab', 'bc', '8967', 25.4),
('ab', 'bc', '3476', 25.5)
select distinct attr1,
attr5,
revenue,
case when b.rn = 1 then expense else 0 end as expense
from #tempA a
join (select *,ROW_NUMBER()over(partition by attr6 order by attr4,attr5,attr6) as rn from #tempB ) b
on b.attr4 = a.attr1
and b.attr5 = a.attr2
and b.attr6 = a.attr3