2017-07-07 110 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; 
相关问题