2016-08-16 2 views
0

Первоначальная проводка; не мог найти здесь ничего, что решило мой вопрос.Расчет чистой торговой позиции в 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; 

Спасибо!

+0

вход + выход образец? не так, как каждый разработчик - финансовый парень. – Steve

+0

Пример ввода - это изображение таблицы выше, выборка будет равна: deal_counterparty_id || deal_instrument_id || нетто-позиция 701 || 1001 || -3495.40 701 || 1002 || 7825.01 ... 701 || 1020 || 1938,23 702 || 1001 || 4726.44 –

+0

Вместо 'JOIN', я бы начал с' IF (deal_type = 'B', deal_amount, - deal_amount) net_amount'. –

ответ

1

Если я понимаю, что вы просите, это должно работать:

SELECT deal_counterparty_id, deal_instrument_id, 
    SUM(IF(deal_type = 'B', - deal_amount, deal_amount)) net_position FROM deal 
    GROUP BY deal_counterparty_id, deal_instrument_id 

То есть (в редакции от последнего комментария), я думаю, вы лечения deal_type из «B», как отрицательное значение и deal_type 'S' в качестве положительного, а затем просто добавляя все вместе.

+0

Удивительно, спасибо! Это было намного легче, чем я ожидал. –

0

.: например

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(dealid INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,deal_counterparty_id INT NOT NULL 
,deal_instrument_id INT NOT NULL 
,deal_type CHAR(1) NOT NULL 
,deal_amount DECIMAL(7,2) NOT NULL 
); 

INSERT INTO my_table VALUES 
(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); 

SELECT deal_counterparty_id 
    , deal_instrument_id 
    , SUM(CASE WHEN deal_type = 'S' THEN -1*deal_amount ELSE deal_amount END) net_position 
    FROM my_table 
GROUP 
    BY deal_counterparty_id 
    , deal_instrument_id; 
+----------------------+--------------------+--------------+ 
| deal_counterparty_id | deal_instrument_id | net_position | 
+----------------------+--------------------+--------------+ 
|     701 |    1001 |  -3412.81 | 
|     701 |    1004 |  8527.11 | 
|     701 |    1011 |  -2441.77 | 
|     701 |    1012 |  1858.82 | 
|     702 |    1011 |  -2415.16 | 
|     703 |    1009 |  3571.77 | 
|     703 |    1010 |  7222.14 | 
|     704 |    1003 |  -1426.14 | 
+----------------------+--------------------+--------------+ 
Смежные вопросы