Запрос SQL для суммирования по столбцу с функцией знака другого столбца - PullRequest
0 голосов
/ 03 мая 2018

У меня есть следующая таблица:

DROP TABLE IF EXISTS trades;
CREATE TABLE trades( 
    id      integer,
    type    text,
    price   double ,
    cpty    text,
    notional double);

INSERT INTO trades VALUES (1,'BUY',96.28,"CPTY1",20000);
INSERT INTO trades VALUES (1,'BUY',97.28,"CPTY2",20000);
INSERT INTO trades VALUES (1,'SELL',99.28,"CPTY1",100000);
INSERT INTO trades VALUES (1,'SELL',98.28,"CPTY3",400000);
INSERT INTO trades VALUES (1,'SELL',95.28,"CPTY3",600000);

Я хотел бы суммировать условное обозначение, но условное значение следует умножить на:

  • 1, если сделка является покупкой
  • -1, если сделка, если продать

В основном результат должен быть:

20000+20000-100000-400000-600000 = -1060000

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Попробуйте это (написано для MS SQL; может работать и для других разновидностей SQL):

select sum
(
    case 
        when [type] = 'BUY' then 1 
        when [type] = 'SELL' then -1 
        else 0 
    end 
    * price
) 
from trades

Оператор case преобразует BUY / SELL в 1 / -1 для каждой строки (я также сказал 0 для тех случаев, когда это невозможно в случае, если это возможно). *

Результат оператора case затем умножается на цену, чтобы получить значение этой строки.

Все вышеперечисленное инкапсулировано в sum, поэтому мы получаем результат для всех строк.

* в качестве дополнительного пункта; если у вас есть только «КУПИТЬ» или «ПРОДАТЬ», вы можете заменить столбец [type] типа text на столбец TypeIsBuy bit; поэтому база данных ограничена значением true / false, и вы используете наименьший объем пространства, необходимый для хранения информации.

0 голосов
/ 03 мая 2018

Похоже, что это вопрос MySQL, но запрос использует довольно стандартный SQL и должен работать для других СУБД.

SQL Fiddle

Настройка схемы MySQL 5.6 :

DROP TABLE IF EXISTS trades;
CREATE TABLE trades( 
    id      integer,
    type    text,
    price   double ,
    cpty    text,
    notional double);

INSERT INTO trades VALUES (1,'BUY',96.28,"CPTY1",20000);
INSERT INTO trades VALUES (1,'BUY',97.28,"CPTY2",20000);
INSERT INTO trades VALUES (1,'SELL',99.28,"CPTY1",100000);
INSERT INTO trades VALUES (1,'SELL',98.28,"CPTY3",400000);
INSERT INTO trades VALUES (1,'SELL',95.28,"CPTY3",600000);

Запрос 1 :

SELECT cpty
  , SUM(
      CASE 
        WHEN type = 'BUY' THEN notional
        WHEN type = 'SELL' THEN - notional
        ELSE 0
        END
    )  AS notionalTotal
FROM trades
GROUP BY cpty

Результаты

|  cpty | notionalTotal |
|-------|---------------|
| CPTY1 |        -80000 |
| CPTY2 |         20000 |
| CPTY3 |      -1000000 |

РЕДАКТИРОВАТЬ: у меня изначально был подзапрос, а затем суммировал по этому, но в этом случае, это не нужно. Я упростил.

0 голосов
/ 03 мая 2018

Вы можете использовать следующее (я предположил, что ваш DB как MySQL):

SELECT sum(case when type = 'SELL' then -notional 
                when type = 'BUY'  then  notional 
            end) sum_notional
  FROM trades;

 sum_notional
 ------------
   -1060000

Демонстрация SQLFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...