[英]Usage of result from one column in computation in different column in MSSQL Server
I'm trying to use the result from one column in computation in later columns in MS SQL Server. 我试图在MS SQL Server的更高版本中的计算中使用一列的结果。
Below is my SQL code: 以下是我的SQL代码:
SELECT
(SELECT 'EURUSD' AS a) AS symbol_name,
(SELECT TOP 1 ROUND(p.BidLast,5) FROM mt5_prices p WHERE p.Symbol LIKE 'EURUSD%') AS Bid,
(SELECT SUM(m.Volume)
FROM mt5_positions m
WHERE m.Symbol LIKE 'EURUSD%' AND m.Login IN (SELECT u.Login FROM mt5_users u WHERE u."Group" LIKE 'real%') AND m."Action" = 0) AS TotalBuy,
(SELECT CASE
WHEN 'EURUSD' LIKE 'USOIL%' OR 'EURUSD' LIKE 'UKOIL%' OR 'EURUSD' LIKE 'Bund%' THEN ROUND(TotalBuy/10*Bid,2)
WHEN 'EURUSD' LIKE 'NGAS%' OR 'EURUSD' LIKE 'Copper%' THEN ROUND(TotalBuy/1*Bid,2)
ELSE ROUND(TotalBuy/100*Bid,2) END) AS ExpositionBuyLots
Of course, the error returned is: 当然,返回的错误是:
SQL Error (207): Invalid column name 'TotalBuy'
SQL错误(207):无效的列名'TotalBuy'
Invalid column name 'Bid'.无效的列名称“出价”。
My question is: How can I use the already (or, so to speak "on-the-fly") computed result from columns TotalBuy
and Bid
? 我的问题是:如何使用
TotalBuy
和Bid
列中已经 (或可以说是“即时”)计算的结果? I read about computed columns, but unfortunately, modification of database is not possible. 我阅读了有关计算列的信息,但不幸的是,无法修改数据库。
MS SQL Server 2012 version. MS SQL Server 2012版本。
EDIT: The above functionality is available in MySQL, I hope in MS SQL this can be achieved too. 编辑:以上功能在MySQL中可用,我希望在MS SQL中也可以实现。 If someone is interested about the solution (I chose @Damien because it is closest one to the original MySQL query (yes, it is query, rewritten from MySQL to MSSQL), ie require only small SQL modification):
如果有人对解决方案感兴趣(我选择@Damien,因为它与原始MySQL查询最接近(是的,它是查询,从MySQL重写为MSSQL),即仅需进行少量SQL修改):
SELECT * FROM
(SELECT 'EURUSD' AS symbol_name) symbol_name
CROSS apply
(SELECT TOP 1 ROUND(p.AskLast,5) AS Ask FROM mt5_prices p WHERE p.Symbol LIKE 'EURUSD%') Ask
CROSS apply
(SELECT TOP 1 ROUND(p.BidLast,5) AS Bid FROM mt5_prices p WHERE p.Symbol LIKE 'EURUSD%') Bid
CROSS apply
(SELECT SUM(m.Volume) AS TotalBuy
FROM mt5_positions m
WHERE m.Symbol LIKE 'EURUSD%' AND m.Login IN (SELECT u.Login FROM mt5_users u WHERE u."Group" LIKE 'real%') AND m."Action" = 0) TotalBuy
CROSS apply
(SELECT SUM(m.Volume) AS TotalSell
FROM mt5_positions m
WHERE m.Symbol LIKE 'EURUSD%' AND m.Login IN (SELECT u.Login FROM mt5_users u WHERE u."Group" LIKE 'real%') AND m."Action" = 1) TotalSell
CROSS apply
(SELECT (CASE
WHEN 'EURUSD' LIKE 'USOIL%' OR 'EURUSD' LIKE 'UKOIL%' OR 'EURUSD' LIKE 'Bund%' THEN ROUND(TotalBuy/10*Bid,2)
WHEN 'EURUSD' LIKE 'NGAS%' OR 'EURUSD' LIKE 'Copper%' THEN ROUND(TotalBuy/1*Bid,2)
ELSE ROUND(TotalBuy/100*Bid,2) END) AS ExpositionBuyLots) ExpositionBuyLots
You can use another sub query block to achieve this: 您可以使用另一个子查询块来实现此目的:
SELECT (
CASE
WHEN 'EURUSD' LIKE 'USOIL%'
OR 'EURUSD' LIKE 'UKOIL%'
OR 'EURUSD' LIKE 'Bund%'
THEN ROUND(TotalBuy / 10 * Bid, 2)
WHEN 'EURUSD' LIKE 'NGAS%'
OR 'EURUSD' LIKE 'Copper%'
THEN ROUND(TotalBuy / 1 * Bid, 2)
ELSE ROUND(TotalBuy / 100 * Bid, 2)
END
) AS ExpositionBuyLots, *
FROM (
SELECT ( SELECT 'EURUSD' AS a ) AS symbol_name
,( SELECT TOP 1 ROUND(p.BidLast, 5)
FROM mt5_prices p
WHERE p.Symbol LIKE 'EURUSD%'
) AS Bid
,( SELECT SUM(m.Volume)
FROM mt5_positions m
WHERE m.Symbol LIKE 'EURUSD%'
AND m.LOGIN IN (
SELECT u.LOGIN
FROM mt5_users u
WHERE u."Group" LIKE 'real%'
)
AND m."Action" = 0
) AS TotalBuy
) AS R
You can use cross apply
(or subqueries) to introduce additional select
clauses. 您可以使用
cross apply
(或子查询)来引入其他select
子句。 Each select
clause is computed "as if" all expressions are computed in parallel - that's why there cannot be dependencies between the expressions within a single select
clause. 每个
select
子句都是“好像”并行计算所有表达式的-这就是为什么单个select
子句中的表达式之间不能存在依赖关系的原因。
Eg: 例如:
select
*
from
sys.objects
cross apply
(select object_id + 10 as mega_object_id) u
cross apply
(select mega_object_id / 30 as little_object_id) w
You should use APPLY
operator. 您应该使用
APPLY
运算符。 You can use values from YourTable
in APPLY
您可以在
APPLY
使用YourTable
中的值
SELECT
ExpositionBuyLots = CASE
WHEN 'EURUSD' LIKE 'USOIL%' OR 'EURUSD' LIKE 'UKOIL%' OR 'EURUSD' LIKE 'Bund%' THEN ROUND(ComputedValues.TotalBuy/10*ComputedValues.Bid,2)
WHEN 'EURUSD' LIKE 'NGAS%' OR 'EURUSD' LIKE 'Copper%' THEN ROUND(ComputedValues.TotalBuy/1*ComputedValues.Bid,2)
ELSE ROUND(ComputedValues.TotalBuy/100 * ComputedValues.Bid,2) END
FROM YourTable
OUTER APPLY (
SELECT
symbol_name = 'EURUSD',
Bid = (SELECT TOP 1 ROUND(p.BidLast,5) FROM mt5_prices p WHERE p.Symbol LIKE 'EURUSD%') ,
TotalBuy = (SELECT SUM(m.Volume)
FROM mt5_positions m
WHERE m.Symbol LIKE 'EURUSD%' AND m.Login IN (SELECT u.Login FROM mt5_users u WHERE u."Group" LIKE 'real%') AND m."Action" = 0
)
) ComputedValues
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.