2017-07-07 133 views
0

我正在嘗試將名爲Multiplier的新列添加到名爲Trades的現有表中。此列的行值將取決於交易表上名爲類型的另一列。如果Type不是「Equity」,「Corp」或「Option」,則需要從另一個名爲ContractSize的表中查找該值。最後,我希望Multiplier列的數據類型爲十進制(7,3 。)我的代碼是: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) 
) 

我對這個代碼得到兩個錯誤:

消息156,級別15,狀態1,2 線附近有語法錯誤關鍵字 'AS'
Msg 102,Level 15,State 1,Line 12 '''附近的語法不正確。

Some gu不勝感激。

+1

您是否試圖將此創建爲表格中的「已計算」列?或者只是在創建列後嘗試設置現有數據的初始值? –

回答

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和做到這一點,而不是:UPDATE Portfolio.Trades SET乘數= ( \t CASE \t \t當type = '公平' 然後1 \t \t當Type = '公司' 然後0.1 \t \t當Type = '選項' 然後將100 \t ELSE \t \t(SELECT ContractSize FROM Portfolio.ContractSize CS \t \t WHERE Portfolio.Trades.Identifier = CS.Identifier) \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; 
相關問題