2014-11-04 100 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