2016-08-16 9 views
0

初めての投稿。私の質問を解決するためにここに何も見つかりませんでした。私は、各位置での各ディーラーのための実現位置を見つけたいSQLでネット取引位置を計算する

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 

は、私は約63万エントリ、ここではサンプル入力との契約のテーブルを持っています。すなわち、ディーラーは、1つの取引相手に対して1つの取引について何千もの取引を行っているので、その取引相手に対するその商品の正味のポジションは何ですか?

私は3つの列、deal_counterparty_id、deal_instrument.id、ネットのポジションが必要です。私は4カウンターパーティ(701、702、703、704)と20個の楽器(1001年から1020年)を持っているので、サンプル出力は次のようになります(0結果取得)

deal_counterparty_id deal_instrument_id net_position 
       701    1001 5833.34 
       701    1002 -3994.21 
       701    1003 30300.00 
... 
       702    1001 

マイコード:

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 

、私はあなたが「B」のdeal_typeなどを治療していると思っています負の値であり、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 | 
+----------------------+--------------------+--------------+ 
関連する問題