2012-01-25 9 views
4

SQL Server 2008では、東と西のコストを含む一連のデータがあります。カナダの顧客に新しい分野を追加しています。これは、東または西のコストの1.5倍になる必要があります。だから私は実行できるいくつかのSQLを考え出すことを試みている。私は、次のことを試してみたが、成功持っていなかった:私はこれを行う簡単な方法があります確信しているSELECTに基づくSQL条件付き更新

UPDATE ShippingCost 

SET 

    IF EastCost>WestCost 

     Canada= EastCost*1.8 

    ELSE 

     Canada= WestCost*1.8 
    ENDIF 

を?何か案は?

+0

ご使用のデータベースプラットフォームを指定してください。 – Dan

+0

MS SQL Server 2008の使用 – Damon

+0

仕様では、「東または西のコスト(これよりも大きい)の1.5倍」つまり、係数は1.5ですが、コードでは係数1.8が使用されます。 – onedaywhen

答えて

14

あなたはケース

UPDATE ShippingCost 

SET 
    Canada = CASE WHEN EastCost>WestCost THEN EastCost*1.8 
        ELSE WestCost*1.8 END 
+0

優秀!正確に私が望むように動作します。ありがとう! – Damon

0

使用して、2つのUPDATE文を使用する必要があります。

UPDATE SHIPPINGCOST SET Canada = EastCost*1.8 WHERE EastCost>WestCost 
UPDATE SHIPPINGCOST SET Canada = WestCost*1.8 WHERE EastCost<=WestCost 
+0

1つのステートメントで2つ使用できるのはなぜですか? – Taryn

+1

パフォーマンス。表が大きい場合、CASEステートメントを使用する場合、オプティマイザーが索引を利用するほどスマートではない可能性があります。また、CASE句がどのように移植可能であるかもわかりません。古いオラクルバージョンではサポートされていないことが分かっています(DECODEを使用する必要がありました)。これはANSI標準ですが、実行しているDBのバージョンで動作することを確認する必要があります。 – schtever

0
UPDATE ShippingCost SET Canada = GREATEST(EastCoast, WestCoast) * 1.8; 

注: T-SQLの方言がGREATESTをサポートしていませんが。

+0

MySQLとOracleは 'GREATEST'を持っていますが、' Max(a、b) 'を行うDialectは考えられません。 –

+0

はい、' MAX'ではなく 'GREATEST'です。間違って申し訳ありません! 'MAX'はこの場合動作しない別の関数です。 – xphantom

+0

カナダ=大いに...正しいようです。 – kkurian

0
UPDATE ShippingCost 
    SET Canada = 1.5 * CASE 
         WHEN EastCost > WestCost THEN EastCost 
         ELSE WestCost 
         END; 
関連する問題