2014-11-04 48 views
1

我试图从包含多次出现accountID的表中更新一个唯一accountID的表。因此,例如,我在表B中有accountID 1一次,而在表A中有accountID 1发生5次。如果When不为真,则什么也不做的Case语句

所以基本上,我要从多行更新到一行,所有的数据在这一行上。

实施例:

表A具有每帐户ID

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

我需要更新,只有具有帐户ID,没有其他数据表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 

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

如果“when”不正确,我需要case case语句不做任何事情的方法。或者我需要一个完全不同的方法来更新此表。

+0

感谢您编辑此贴。我无法弄清楚如何制作表格示例。 – 2014-11-04 16:39:30

+0

您不希望使用WHERE条款更新过滤器行,或者将列设置为等于自身(即当前值,无变化)。 – Yuck 2014-11-04 16:40:32

+0

使用'..当12然后硬其他site12_hard ...'。 – Andrew 2014-11-04 16:41:23

回答

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