SQL:添加一个基于CASE表达式的新列,并从另一个表中查找值
我正在尝试将名为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不胜感激。
两个步骤操作:
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;
甚至只是把它作为一个计算列。
是,ON关联应该是。 T.Identifier = CS.Identifier。 – MilesToGoBeforeISleep
谢谢,这个工作,但奇怪的是,我只取出来后别名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
@MilesToGoBeforeISleep因为具有别名的UPDATE的sql-server语法是'UPDATE Portfolio.Trades FROM Portfolio.Trades T' ... – Serg
每个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
)
为什么要在表中添加列?您可以创建一个视图。
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;
您是否试图将此创建为表格中的“已计算”列?或者只是在创建列后尝试设置现有数据的初始值? –