在SQL Server中使用不同的值更新重复记录

时间:2019-02-15 05:00:58

标签: sql sql-server

我有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只是简单的属性)

1 个答案:

答案 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