2017-08-14 8 views
0

ロジックに基づいて価格を選択するコードがあります。私たちの選択肢は、ターゲットマージン、平均過去価格、市場価格です(これらはすべて計算されています)。時には、その論理を無視して、「このモデルでは、すでに選択したものではなく、この価格を使用してください」と明示的に言いたいことがあります。しかし、私はまた、私が使った価格を保持しています。これで私の価格は問題なく設定されます。SQL Update 2 1つのケースの列

Update A 
Set [Price] = Case 
    When [Logic Override] = 1 THEN [Target Margin Price] 
    When [Logic Override] = 2 THEN [Average Historical Price] 
    When [Logic Override] = 3 THEN [Market Price] 
    Else [Price] 
    END 
From PriceTable A 
Where ([Logic Override] <> 4 and [Logic Override] is not null) 
and [Model_ID] = Coalesce(NullIf(@ModelID, ''), [Model_ID]) 

[価格設定方法]を設定することもできます。ロジックオーバーライドが1の場合、本当にやりたいことが価格と価格設定方法の両方を、例えば$ 20と 'Target Margin'に設定すると、全く新しいケースステートメントを作成する必要がありますか?私はこれを行うための正しい構文を得ることができないようです。

答えて

0

(同じテーブルを更新しようとしている限り)すべての列に複数のSQLロジックを作成できます。

実際に必要な結果が混乱していて、わからない場合は、これによって、WHERE句が異なる複数の列を更新するのに役立ちます。あなたが尋ねようとしていると思います。

Update A 
Set [Price] = (Select Case 
        When [Logic Override] = 1 THEN [Target Margin Price] 
        When [Logic Override] = 2 THEN [Average Historical Price] 
        When [Logic Override] = 3 THEN [Market Price] 
        Else [Price] 
        END 
        From PriceTable A 
        Where ([Logic Override] <> 4 and [Logic Override] is not null) 
        and [Model_ID] = Coalesce(NullIf(@ModelID, ''), [Model_ID]), 

     [Pricing Method] = (Select '$20' as [Pricing Method] from PriceTable A where [logic 
     Override] = 1), 

     [Price] = (Select '$20' as [Price] from PriceTable A where [logic Override] = 1), 
     [Target Margin] = (Select '$20' as [Target Margin] from PriceTable A where [logic Override] = 1) 

From PriceTable 

彼らは維持するのは難しいですので、私は実際に更新し、これらのタイプをお勧めしません(更新する必要があることが、複数の論理、テーブルなどあれば、これは面倒です)。各列の更新を作成して、同僚が維持し、読みやすく理解しやすいようにすることをお勧めします。しかし、彼自身のそれぞれに。

+0

お返事ありがとうございます。それはおそらく最善の考えです。私はちょうどそれがすべて一緒だったら維持することがより容易であると思った。私は長年のAccess開発者であり、 "Select Case"ステートメントで非常に簡単に実行でき、SQLのようなものを期待していました。私は価格設定方法の2番目の部分を完全に忘れていたので、私は尋ねました(私はある時点でそこにあったと確信していますが、テストの途中でどこかで削除されているはずです)。 –

0

私はそれらを2つの別々のケース・ステートメントとしてバック・ツー・バックで書こうとしましたが、最初のものだけが価格を更新しました。 2つ目は全く更新されませんでした。そこで、適切な価格を選択しましたが、適切な価格設定方法は選択しませんでした。実際に働いたのはこれです。

Update A 
Set [Price] = Case 
When [Logic Override] = 1 THEN [Target Margin Price] 
When [Logic Override] = 2 THEN [Average Historical Price] 
When [Logic Override] = 3 THEN [Market Price] 
Else [FRP] 
END, 

[Pricing Method] = Case 
When [Logic Override] = 1 THEN 'Target Margin' 
When [Logic Override] = 2 THEN 'Historical Average' 
When [Logic Override] = 3 THEN 'Market Price' 
Else [FRP] 
END 

From PriceTable A 
Where ([Logic Override] <> 0 and [Logic Override] is not null) 
and [Model_ID] = Coalesce(NullIf(@ModelID, ''), [Model_ID]) 

私は本当に私は2つの別々の更新ステートメントを使用することができませんでした理由はわからないんだけど、この作品以来、私はそれについてあまり心配していません。私が持っていたよりもコードが多いですが、それが動作してから心配しているわけではありません。

関連する問題