如果When不成立则不作用的Case语句

时间:2014-11-04 16:34:30

标签: sql-server

我正在尝试从包含多次出现的accountID的表中更新具有唯一accountID的表。例如,我在表B中有一次accountID 1,在表A中有一次出现5次的accountID 1。

所以基本上我会从多行更新到一行,其中包含该行的所有数据。

示例:

表A具有每个accountID的多个记录

accountID  site  hard  soft     
1           12     20   0 
1           13     30   10
1           14     40   0

我需要更新只有accountID且没有其他数据的表B.看起来像这样:

accountID   site12_hard site12_soft  site13_hard site13_soft  site14_hard site14_soft
1

所以我链接了accountID并为所有字段做了case语句。像这样:

update table B set

site12_hard = case when site  = 12 then hard else 0 end,
site12_soft = case when site  = 12 then soft else 0 end,


from table A inner join table B on accountID = accountID

这不能正常工作,因为accountID上的一对多链接会导致case语句评估该accountID的每次出现。因此它可以在site12_hard上正确更新,但是当它移动到accountID = 1的下一条记录时,它不再是site = 12,所以它更新为零。

如果“when”不成立,我需要一种方法让case语句不执行任何操作。或者我需要一种完全不同的方法来更新此表。

1 个答案:

答案 0 :(得分:0)

我刚刚为site 12 & 13做了类似site 14必须完成的工作。试试这个..

UPDATE B
SET    site12_hard = a.site12_hard,
       site12_soft = a.site12_soft,
       site13_hard = a.site13_hard,
       site13_soft = a.site13_soft
FROM   tableB B
       INNER JOIN (SELECT accountID,
                          Max(CASE WHEN [site] = 12 THEN hard END) site12_hard,
                          Max(CASE WHEN [site] = 12 THEN soft END) site12_soft,
                          Max(CASE WHEN [site] = 13 THEN hard END) site13_hard,
                          Max(CASE WHEN [site] = 13 THEN soft END) site13_soft
                   FROM   tableA
                   GROUP  BY accountID) a
               ON a.accountID = b.accountID