2017-07-07 14 views
0

Tradesという既存のテーブルに乗算器という新しい列を追加しようとしています。この列の行の値は、タイプと呼ばれるTradesテーブルの別の列に依存します。 Typeが "Equity"、 "Corp"または "Option"以外の場合は、ContractSizeという別のテーブルから値を参照する必要があります。最後に、乗数列のデータ型を10進数。)私が持っていたコードはでした:私はこのコードに2つのエラーを取得していますSQL:CASE式に基づいて新しい列を追加し、別のテーブルから値を検索する

ALTER TABLE Portfolio.Trades 
ADD Multiplier decimal(7,3) AS 
(
CASE 
WHEN Type = 'Equity' Then 1 
WHEN Type = 'Corp' Then 0.1 
WHEN Type = 'Option' Then 100 
ELSE 
(SELECT ContractSize FROM Portfolio.ContractSize CS 
JOIN Portfolio.Trades T 
ON T.Identifier = CS.ContractSize) 
) 

: 'AS' キーワードの近くに

メッセージ156、レベル15、状態1、行2 正しくない構文
メッセージレベル102、レベル15、状態1、行12 ')'の近くの構文が正しくありません。

グーグルidanceは非常に高く評価されています。

+1

これをテーブルの「計算済み」列として作成しようとしていますか?または、列の作成後に既存のデータの初期値を設定しようとしていますか? –

答えて

2

は、2つのステップでこれを行います

ALTER TABLE Portfolio.Trades ADD Multiplier decimal(7,3); 

UPDATE T 
    SET Multiplier = (CASE WHEN T.Type = 'Equity' Then 1 
          WHEN T.Type = 'Corp' Then 0.1 
          WHEN T.Type = 'Option' Then 100 
          ELSE (SELECT CS.ContractSize 
           FROM Portfolio.ContractSize CS 
           WHERE T.Identifier = CS.ContractSize) 
         END) 
    FROM Portfolio.Trades T; 

は私がON /相関条件が間違っていることを推測しています。それが正しい場合は、次のようにしてください:

UPDATE T 
    SET Multiplier = (CASE WHEN T.Type = 'Equity' Then 1 
          WHEN T.Type = 'Corp' Then 0.1 
          WHEN T.Type = 'Option' Then 100 
          ELSE T.Identifier) 
         END) 
    FROM Portfolio.Trades T; 

さらに、これを計算カラムとして追加するだけでも可能です。

+0

はい、ON相関があるはずです。 T.Identifier = CS.Identifier。 – MilesToGoBeforeISleep

+0

おかげで、これは動作しますが、不思議な、私は別名Tを取り出し、代わりにこれを行う後にのみ: SET乗数= ( \t CASE UPDATEのPortfolio.Tradesを \t \t次にタイプ=資本 "1 \t \t WHENタイプ次に0.1 \t \tタイプ= 'オプション' = '社' ELSEそして100 \t \t \t(Portfolio.ContractSize CSからPortfolio.Trades.Identifier = CS.Identifier \t \t ContractSize選択)を \t END ) – MilesToGoBeforeISleep

+1

@MilesToGoBeforeISleepエイリアスを持つUPDATEのSQL Server構文は、「UPDATE Portfolio.Trades FROM Portfolio.Trades T' ... – Serg

0

すべてのCASE文には、条件の最後にENDキーワードが必要です。この場合、それはこのようにすべきです。

ALTER TABLE Portfolio.Trades 
ADD Multiplier decimal(7,3) AS 
(
CASE 
WHEN Type = 'Equity' Then 1 
WHEN Type = 'Corp' Then 0.1 
WHEN Type = 'Option' Then 100 
ELSE 
(SELECT ContractSize FROM Portfolio.ContractSize CS 
JOIN Portfolio.Trades T 
ON T.Identifier = CS.ContractSize)END 
) 
0

なぜ列をテーブルに追加しますか?代わりにビューを作成することもできます。

CREATE VIEW myView AS 
    SELECT *, -- your real column list here 
     CAST(CASE 
     WHEN Type = 'Equity' Then 1 
     WHEN Type = 'Corp' Then 0.1 
     WHEN Type = 'Option' Then 100 
     ELSE 
      (SELECT ContractSize 
      FROM Portfolio.ContractSize CS 
      WHERE T.Identifier = CS.ContractSize) 
     END AS decimal(7,3)) AS Multiplier 
    FROM 
    Portfolio.Trades T; 
関連する問題