2017-05-31 1 views
0

MS SQL Serverの後の列の計算で1つの列の結果を使用しようとしています。以下はMSSQL Serverの異なる列の計算における1つの列の結果の使用

私の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バージョン。

EDIT:上記の機能はMySQLで利用可能ですが、私はMS SQLでこれも実現することを願っています。 誰かが解決策について関心がある場合(これは、元のMySQLのクエリに1最も近いので、私は@Damienを選んだ(はい、それは、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 
+0

YourTableからの値を使用できますか? – Leonidas199x

+1

私の知る限り、あなたのカラムが(計算カラムのような)スキーマの一部でない限り、あなたのようなSQLクエリから結果を得ることはできません。現時点で私が念頭に置いている解決策は、一時テーブル(後で削除する)を使用して結果を保存することです。私はこれをやるより良い方法が可能だと思います。 –

+1

@AlbertoSolano - テンポラリテーブルを導入することは、クエリを複数の独立したクエリに分割し、サーバに論理クエリを「全体として」最適化する機会を少なくすることを意味するため、貧弱なアプローチです。サブクエリは、単一のクエリに含まれるすべてを保持します。 –

答えて

3

あなたは追加のselect条項を導入するcross apply(またはサブクエリ)を使用することができます。各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 
+0

Saved my day、ダミアン – bodi0

3

あなたはこれを達成するために別のサブクエリブロックを使用することができます。

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 
+0

あなたのソリューションをありがとう、それは動作しますが、それを達成するための複雑な方法が少なくてすむはずです。サブクエリは、私が避けようとしているものです。 – bodi0

+2

@ bodi0元のクエリは_all_サブクエリです! –

+0

@Craig Young - そうです。そのため、私はそれらを最小限に抑えることを好む理由があります(パフォーマンスに影響がない限り、**コードは醜いです)。 – bodi0

0

あなたはAPPLY演算子を使用する必要があります。あなたは、あなたがすべてのあなたの計算を保存するために一時テーブルを使用することはできAPPLY

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 
関連する問題