2017-02-13 113 views
1

我想基於表中列的值更新臨時表。我的CASE聲明似乎不起作用。有任何想法嗎?非常感謝。無法執行與CASE語句更新

這裏是我創建臨時表的地方。這些列包含值。

IF OBJECT_ID('tempdb..#Accounts') IS NOT NULL DROP TABLE #Accounts; 
Create Table #Accounts 
(
    FA_rows bigint, 
    PR_rows bigint, 
    NewFARate1 decimal(10,5), 
    NewFARate2 decimal(10,5), 
    NewFARate3 decimal(10,5), 
    NewFARate4 decimal(10,5), 
    NewFARate5 decimal(10,5), 
    PctRate1 decimal (10,5), 
    PctRate2 decimal (10,5), 
    PctRate3 decimal (10,5), 
    PctRate4 decimal (10,5), 
...PctRate10 decimal (10,5) 
) 

這裏的嘗試更新(我已經添加了更多細節):

UPDATE #Accounts 

--when fa_rows is 2 I need to do this 
    SET NewFARate1 = CASE FA_rows WHEN 2 THEN PctRate12 - PctRate7 END, 
    NewFARate2 = CASE FA_rows WHEN 2 THEN PctRate3 - PctRate8 END, 

---when fa_rows is 3 I need to do this 
    SET NewFARate1 = CASE FA_rows WHEN 3 THEN PctRate12 - PctRate7 END, 
    NewFARate2 = CASE FA_rows WHEN 3 THEN PctRate3 - PctRate8 END, 
    NewFARate3 = CASE FA_rows WHEN 3 THEN PctRate3 - PctRate8 END 

--when fa_rows is 4 I need to do this 
    SET NewFARate1 = CASE WHEN 4 THEN PctRate2 - PctRate7 END, 
    NewFARate2 = CASE WHEN 4 THEN PctRate3 - PctRate8 END, 
    NewFARate3 = CASE WHEN 4 THEN PctRate4 - PctRate9 END, 
    NewFARate4 = CASE WHEN 4 THEN PctRate5 - PctRate10 END      
    WHERE FA_rows = PR_rows 

此代碼顯然是行不通的。預處理器不像多個SET命令。

+0

它不是'CASE' *聲明*,它是*表達式*。 'CASE'不能用作SQL中的控制流。 – Siyual

+0

這不起作用。 CASE語句不是IF/ELSE邏輯。 –

+1

爲什麼有人會低估這一點?這似乎是一個完全合法的問題,並且誤解了某些事情是如何運作的。 –

回答

2

將CASE視爲更多的返回值而不是條件的函數。

UPDATE #Accounts 
SET NewFARate1 = CASE fa_rows WHEN 2 THEN PctRate2 - PctRate7 WHEN 3 THEN PctRate2 - PctRate7 END, 
    NewFARate2 = CASE fa_rows WHEN 2 THEN ... etc 
... 
END 
WHERE FA_rows = PR_rows 
+0

嗨喬,感謝這個解決方案,但我想我沒有充分描述這個問題。我需要根據FA_rows的值爲每條記錄更新列NewFARate1,NewFARate2 ...等。所以這就是我想要做的,但我使用的SQL顯然不工作: –

+0

@LionB只要添加一個ELSE的case語句,設置FA的東西本身,如果你不想更新它 –

+0

謝謝但問題仍未解決。請再看看這個問題。我已經更新了它。另外,ELSE是可選的,不應該影響代碼,如果省略是正確的? –

2

CASE表達,而不是一個語句。它不能用作SQL中的邏輯控制。但是,您可以使用下面的方法給你的結果:以上

Update #Accounts 
Set  NewFARate1 = Case 
         When fa_rows In (2, 3) 
          Then PctRate2 - PctRate7 
         Else NewFARate1 End, 
     NewFARate2 = Case 
         When fa_rows In (2, 3) 
          Then PctRate3 - PctRate8 
         Else NewFARate2 End, 
     NewFARate3 = Case 
         When fa_rows In (3) 
          Then PctRate4 - PctRate9 
         Else NewFARate3 End 
Where FA_rows = PR_rows 

使用單獨CASE表達式來確定哪些更新列的值。如果它不在所提供的值中,它會將列的值設置爲自身 - 因此不更新列。

+0

我想我沒有充分描述這個問題。我需要根據FA_rows的值爲每條記錄更新列NewFARate1,NewFARate2 ...等。所以這就是我想要做的。如果fa-rows是2,那麼我想更新NewFARate1&NewFARate2。如果fa_rows是3,那麼我想更新NewFARate1,NewFARate2和NewFARate3。因此,我將始終更新NewFARate1,但N表中的每一行都爲N。我希望這是明確的。 –

+0

@LionB除非我錯過了一些東西,否則我的解決方案將完成此操作。 – Siyual

+0

Siyual。你是絕對正確的。這工作!我基於你的邏輯改變了我的查詢,得到了這個: –