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'
無効な列名「入札'
私の質問は:はどのように列TotalBuy
とBid
からすでに(または、その「オン・ザ・フライ」話す)計算結果を使用することができますか?私は計算された列について読んだが、残念ながらデータベースの変更は不可能である。
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
に
YourTable
からの値を使用できますか? – Leonidas199x私の知る限り、あなたのカラムが(計算カラムのような)スキーマの一部でない限り、あなたのようなSQLクエリから結果を得ることはできません。現時点で私が念頭に置いている解決策は、一時テーブル(後で削除する)を使用して結果を保存することです。私はこれをやるより良い方法が可能だと思います。 –
@AlbertoSolano - テンポラリテーブルを導入することは、クエリを複数の独立したクエリに分割し、サーバに論理クエリを「全体として」最適化する機会を少なくすることを意味するため、貧弱なアプローチです。サブクエリは、単一のクエリに含まれるすべてを保持します。 –