繁体   English   中英

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

[英]Usage of result from one column in computation in different column in MSSQL Server

我试图在MS SQL Server的更高版本中的计算中使用一列的结果。

以下是我的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

当然,返回的错误是:

SQL错误(207):无效的列名'TotalBuy'
无效的列名称“出价”。

我的问题是:如何使用TotalBuyBid列中已经 (或可以说是“即时”)计算的结果? 我阅读了有关计算列的信息,但不幸的是,无法修改数据库。

MS SQL Server 2012版本。

编辑:以上功能在MySQL中可用,我希望在MS SQL中也可以实现。 如果有人对解决方案感兴趣(我选择@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

您可以使用另一个子查询块来实现此目的:

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

您可以使用cross apply (或子查询)来引入其他select子句。 每个select子句都是“好像”并行计算所有表达式的-这就是为什么单个select子句中的表达式之间不能存在依赖关系的原因。

例如:

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

您应该使用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