简体   繁体   English

在MSSQL Server的不同列中的计算中使用一列结果

[英]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 ? 我的问题是:如何使用TotalBuyBid列中已经 (或可以说是“即时”)计算的结果? 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM