Как присоединиться при другом условии ГДЕ? - PullRequest
1 голос
/ 01 мая 2020

[Посоветуйте другой заголовок можно только приветствовать]

Простите, я очень новичок в запросе синтаксиса, и я изо всех сил пытаюсь найти ответ на следующий вопрос.

У меня есть таблица данных, детализирующая сделки с акциями 'tb_trades', положительные объемы - это покупки, отрицательные - продажи:

ID | Symbol | Price | Volume | Charges
---+--------+-------+--------+--------
1  | BP     | 300   | +100   | 15
2  | BP     | 310   | +100   | 15
3  | TOT    | 250   | +50    | 20
4  | BP     | 340   | -20    | 10

Мне нужен запрос, который возвращает для каждого символа средневзвешенную цену покупки, баланс объема и сумма ВСЕХ начислений, поэтому для вышеуказанного:

Symbol | Avg Price | Volume | Total Charges
-------+-----------+--------+--------------
 BP    | 305       | +180   | 40
 TOT   | 250       | +50    | 20

Я получил средневзвешенную цену с «условием покупки», как показано ниже:

    SELECT 
        `tb_trades`.`symbol` AS `symbol`,
        (SUM((`tb_trades`.`volume` * `tb_trades`.`price`)) / SUM(`tb_trades`.`volume`)) AS `avg price`,
        SUM(`tb_trades`.`volume`) AS `volume`,
        SUM(`tb_trades`.`charges`) AS `total charges`
    FROM
        `tb_trades`
    WHERE
        (`tb_trades`.`volume` > 0)
    GROUP BY `tb_trades`.`symbol`

ОДНАКО, это, естественно, исключает ПРОДАВАТЬ сборы из общей суммы сборов. Как можно достичь этого мультиусловного поведения?

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Я думаю, что вам нужно условное агрегирование:

select 
    symbol,
    sum(case when volume > 0 then volume * price end) 
        / sum(case when volume > 0 then volume end) as avg_price,
    sum(volume) as volume,
    sum(charges) as total_charges
from tb_trades
group by symbol

В приведенном выше запросе используются условные выражения в функциях агрегирования для вычисления взвешенной цены для продаж.

Демо на БД Fiddle :

symbol | avg_price | volume | total_charges
:----- | --------: | -----: | ------------:
BP     |  305.0000 |    180 |            40
TOT    |  250.0000 |     50 |            20
0 голосов
/ 01 мая 2020

Я использовал функцию объединения для того же:

select symbol,sum(price*volume)/sum(volume) as 'Average Price', sum(Volume) as 'Volume',sum(Charges) as 'Total Charges' from tb_trades where symbol='bp' union select symbol, sum(price*volume)/sum(volume),Volume,Charges  from tb_trades where SYMBOL='TOT' ;

Приносим извинения за неудобства, вызванные тем, как я написал код ... Я новичок в переполнении стека ..

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