簡體   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