Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка полей с помощью подзапроса  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
Приветствую знатоков БД.
В условиях задачи - выбрать торговый инструмент, количество его покупок и продаж, и стоимость этих дейстий
Подскажите, пожалуйста,
как с помощью внутреннего подзапроса выбрать несколько полей?
Пример, где мы обращаемся к одной таблице с одинаковыми условиями выборки и каждый раз выбираем по одному полю
SELECT @Instrument,
buy = (select SUM(quantity)
FROM [DBDeals].[dbo].[Deals]
WHERE sessionID between @SessionStart and @SessionEnd and
accountID = @GWAccountId and
side = 'Buy' and
instrumentName = @Instrument),
price_buy = (select SUM(price*quantity)
FROM [DBDeals].[dbo].[Deals] WITH(NOLOCK)
WHERE sessionID between @SessionStart and @SessionEnd and
accountID = @GWAccountId and
side = 'Buy' and
instrumentName = @Instrument),
sell = (select SUM(quantity)
FROM [DBDeals].[dbo].[Deals] WITH(NOLOCK)
WHERE sessionID between @SessionStart and @SessionEnd and
accountID = @GWAccountId and
side = 'Sell' and
instrumentName = @Instrument),
price_sell = (select SUM(price*quantity)
FROM [DBDeals].[dbo].[Deals]
WHERE sessionID between @SessionStart and @SessionEnd and
accountID = @GWAccountId and
side = 'Sell' and
instrumentName = @Instrument)

Можно ли оптимизировать его в нечто подобное и как (если есть такая возможность)?
SELECT @Instrument,
(select SUM(quantity) as buy, SUM(price*quantity) as price_buy
FROM [DBDeals].[dbo].[Deals]
WHERE sessionID between @SessionStart and @SessionEnd and
accountID = @GWAccountId and
side = 'Buy' and
instrumentName = @Instrument),

(select SUM(quantity) as sell, SUM(price*quantity) as price_sell
FROM [DBDeals].[dbo].[Deals]
WHERE sessionID between @SessionStart and @SessionEnd and
accountID = @GWAccountId and
side = 'Sell' and
instrumentName = @Instrument)

спасибо
30 мар 15, 14:55    [17450237]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей с помощью подзапроса  [new]
0-0
Guest
R.Rollen,

вы бы тегом воспользовались, читать эту портянку невозможно
30 мар 15, 14:58    [17450258]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей с помощью подзапроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
R.Rollen
как с помощью внутреннего подзапроса выбрать несколько полей?

Никак
R.Rollen
Можно ли оптимизировать его в нечто подобное и как (если есть такая возможность)?

PIVOT или CASE внутри агрегатной функции
30 мар 15, 15:03    [17450281]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей с помощью подзапроса  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
Согласен, тогда без лишней писанины суть вопроса повторю
имеется запрос на выборку инструмента, и всех объединенных сделок по нему
На вывод имя, купля, денег на куплю, продажа, денег на продажу
В моем случае он выглядит так

SELECT @Instrument,
buy = (select SUM(quantity) FROM Таблица WHERE А1),
price_buy = (select SUM(price*quantity) FROM Таблица WHERE А1),
sell = (select SUM(quantity) FROM Таблица WHERE А2),
price_sell = (select SUM(price*quantity) FROM Таблица WHERE А2)

где А1 и А2 - условия выборки

Можно ли оптимизировать его в нечто подобное?

SELECT @Instrument,
(select SUM(quantity) as buy, SUM(price*quantity) as price_buy
FROM Таблица WHERE А1),

(select SUM(quantity) as sell, SUM(price*quantity) as price_sell
FROM Таблица WHERE А2)

т.е. другими словами объединить подзапросы с одинаковым условием выборки и вывести несколько полей из внутреннего подзапроса.

в моем желаемом примере выдается следующая ошибка
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS
30 мар 15, 15:07    [17450313]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей с помощью подзапроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
R.Rollen
тогда без лишней писанины суть вопроса повторю

Без лишней писанины вопрос надо задавать вот так https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume
30 мар 15, 15:08    [17450323]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей с помощью подзапроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
select
 @Instrument as instrumentName,
 sum(case when side = 'Buy' then quantity end) as buy,
 sum(case when side = 'Buy' then price*quantity end) as price_buy,
 sum(case when side = 'Sell' then quantity end) as sell,
 sum(case when side = 'Sell' then price*quantity end) as price_sell
from
 [DBDeals].[dbo].[Deals]
where
 sessionID between @SessionStart and @SessionEnd and
 accountID = @GWAccountId and
 instrumentName = @Instrument
30 мар 15, 15:10    [17450333]     Ответить | Цитировать Сообщить модератору
 Re: Выборка полей с помощью подзапроса  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
invm,
спасибо, буду знать, помог
30 мар 15, 15:17    [17450377]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить