SQL:根据大小写表达式添加一个新列,并从另一个表中查找值
我试图将一个名为乘数的新列添加到名为Trades的现有表中。此列的行值将取决于Trades表中名为Type的另一列。如果类型不是Equity、Corp或Option,则需要从另一个名为ContractSize的表中查找该值。最后,我希望乘数列的数据类型为decimal 7,3。我的密码是:SQL:根据大小写表达式添加一个新列,并从另一个表中查找值,sql,sql-server,case,alter-table,Sql,Sql Server,Case,Alter Table,我试图将一个名为乘数的新列添加到名为Trades的现有表中。此列的行值将取决于Trades表中名为Type的另一列。如果类型不是Equity、Corp或Option,则需要从另一个名为ContractSize的表中查找该值。最后,我希望乘数列的数据类型为decimal 7,3。我的密码是: ALTER TABLE Portfolio.Trades ADD Multiplier decimal(7,3) AS ( CASE WHEN Type = 'Equity' Then 1 WHEN T
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)
)
我在这段代码中遇到两个错误:
Msg 156,第15级,状态1,第2行
关键字“AS”附近的语法不正确。
Msg 102,15级,状态1,第12行
附近的语法不正确
一些指导是非常感谢的 分两步执行此操作:
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;
我猜想开/关条件是不正确的。如果正确,您可以执行以下操作:
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;
甚至只需将其添加为计算列。分两步执行:
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;
我猜想开/关条件是不正确的。如果正确,您可以执行以下操作:
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;
甚至可以将其作为计算列添加。每个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
)
每个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;
为什么要在表中添加列?也可以创建视图
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;
您是否试图在表中创建一个“计算”列?或者只是在创建列后尝试设置现有数据的初始值?是否尝试将其创建为表中的“计算”列?或者只是在创建列后尝试设置现有数据的初始值?是的,应该是“基于相关性”。T.Identifier=CS.Identifier.谢谢,这个方法很有效,但很奇怪,只有在我去掉别名T并改为这样做之后:更新Portfolio.Trades设置乘数=CASE当Type='Equity'时,然后当Type='Corp'时为1,当Type='Option'时为0.1,然后从Portfolio.ContractSize CS WHERE Portfolio.Trades.Identifier=CS.Identifier END@MilesToGoBeforeISleep中选择ContractSize,因为别名为UPDATE Portfolio.Trades FROM Portfolio.Trades T…@MilesToGoBeforeISleep的更新的sql server语法为UPDATE Portfolio.Trades FROM Portfolio.Trades T…@MilesToGoBeforeISleep。原始语法适用于大多数数据库。SQL Server的语法略有不同。因为没有数据库标记,所以我只使用了更通用的语法。旧记录现在显示了我想要的乘数值,但是如何更新新记录?乘数显示新记录的空值。如果我重新运行上面的代码,它会工作,但是它会再次遍历所有60000行,而不是添加的10行。是的,应该是相关的。T.Identifier=CS.Identifier.谢谢,这个方法很有效,但很奇怪,只有在我去掉别名T并改为这样做之后:更新Portfolio.Trades设置乘数=CASE当Type='Equity'时,然后当Type='Corp'时为1,当Type='Option'时为0.1,然后从Portfolio.ContractSize CS WHERE Portfolio.Trades.Identifier=CS.Identifier END@MilesToGoBeforeISleep中选择ContractSize,因为别名为UPDATE Portfolio.Trades FROM Portfolio.Trades T…@MilesToGoBeforeISleep的更新的sql server语法为UPDATE Portfolio.Trades FROM Portfolio.Trades T…@MilesToGoBeforeISleep。原始语法适用于大多数数据库。SQL Server的语法略有不同。因为没有数据库标记,所以我只使用了更通用的语法。旧记录现在显示了我想要的乘数值,但是如何更新新记录?乘数显示新记录的空值。如果我重新运行上面的代码,它将工作,但它将再次遍历所有60000行,而不是添加的10行。