Первоначальная проводка; не мог найти здесь ничего, что решило мой вопрос.Расчет чистой торговой позиции в SQL
У меня есть таблица сделки с около 630000 записей, ввод образца здесь:
dealid deal_counterparty_id deal_instrument_id deal_type deal_amount
20001 703 1010 B 3588.81
20002 701 1001 S 3412.81
20003 701 1004 B 8527.11
20004 701 1011 S 2441.77
20005 703 1010 B 3633.33
20006 702 1011 S 2415.16
20007 704 1003 S 1426.14
20008 701 1012 B 1858.82
20009 703 1009 B 3571.77
Я хочу найти осознанное положение для каждого дилера на каждую позицию. т. е. у дилера есть тысячи транзакций по 1 инструменту для 1 контрагента, так, какова чистая позиция по этому инструменту для этого контрагента?
Я хочу 3 колонки: deal_counterparty_id, deal_instrument.id, чистая позиция. Так как у меня есть 20 инструментов (1001-1020) только с 4 контрагентами (701, 702, 703, 704), выходной образец будет выглядеть следующим образом:
deal_counterparty_id deal_instrument_id net_position
701 1001 5833.34
701 1002 -3994.21
701 1003 30300.00
...
702 1001
Мой код (при получении 0 результатов):
select buy.deal_counterparty_id, buy.deal_instrument_id, sum(buy.deal_amount) - sum(sell.deal_amount) as net_position
from (select deal_id, deal_counterparty_id, deal_instrument_id, deal_type, deal_amount
from deal where deal_type = 'B') as buy
join (select deal_id, deal_counterparty_id, deal_instrument_id, deal_type, deal_amount
from deal where deal_type = 'S') as sell
on buy.deal_instrument_id = sell.deal_instrument_id
group by buy.deal_counterparty_id, buy.deal_instrument_id;
Спасибо!
вход + выход образец? не так, как каждый разработчик - финансовый парень. – Steve
Пример ввода - это изображение таблицы выше, выборка будет равна: deal_counterparty_id || deal_instrument_id || нетто-позиция 701 || 1001 || -3495.40 701 || 1002 || 7825.01 ... 701 || 1020 || 1938,23 702 || 1001 || 4726.44 –
Вместо 'JOIN', я бы начал с' IF (deal_type = 'B', deal_amount, - deal_amount) net_amount'. –