2017-02-13 3 views
1

テーブルの列の値に基づいて一時テーブルを更新しようとしています。私のCASEステートメントは動作していないようです。何か案は?大いに感謝します。CASE文でUPDATEを実行できません

ここで私は一時テーブルを作成します。列には値が含まれます。このコードは明らかに動作していない

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 

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) 
) 

はここで試みられ、更新(私は詳細を追加しました)です。プリプロセッサは複数のSETコマンドと似ていません。

+0

これは 'CASE' *文ではなく、*式*です。 'CASE'はSQLの制御フローとして使用できません。 – Siyual

+0

これは動作しません。 CASE文はIF/ELSEロジックではありません。 –

+1

なぜ誰かがこれをdownvoteだろうか?それは完全に正当な疑問や、何かがうまくいくかどうかの誤解のようです。 –

答えて

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

こんにちはJoeさん、このソリューションのおかげで、私は問題を適切に説明していないと思います。 FA_rowsの値に基づいて、各レコードの列NewFARate1、NewFARate2 ...などを更新する必要があります。だからここで私がしようとしているが、私が使用しているSQLは明らかに動作していません: –

+0

@ LionBちょうどそれを更新したくない場合はFAのものを設定するケースステートメントにELSEを追加します –

+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を更新します。私はそれがはっきりしていることを望む –

+0

@LionB私が何かが欠けていない限り、私のソリューションはまさにそれを行うでしょう。 – Siyual

+0

Siyual。あなたは絶対に正しいです。これはうまくいった!私はあなたのロジックに基づいて少し質問を変えて、これを得ました: –

関連する問題