как суммировать два столбца в postgresql?

#sql #postgresql

#sql #postgresql

Вопрос:

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

КОМПАНИИ:

 company country
A        us
B        UK
C        france
  

Торговля:

 seller   buyer   amount
 A         B       10
 B         C       12
  

Я хочу получить сводку покупок и продаж по странам.
Вы можете предположить, что в одной стране нет транзакций

 country  sum_buyer   sum_seller
us                    10
UK         10         12
france     12
  

Как я могу это сделать?

Ответ №1:

Для выполнения этой задачи должен использоваться своего рода сводный запрос:

 SELECT c.country,
       sum(case when c.company = t.buyer then amount end) as sum_buyer,
       sum(case when c.company = t.seller then amount end) as sum_seller
FROM trades t
JOIN companies c ON c.company IN (t.seller, t.buyer)
GROUP BY c.country
ORDER BY 1 DESC
  

Демонстрация: http://www.sqlfiddle.com /#!15/7458d2/15

 | country | sum_buyer | sum_seller |
|---------|-----------|------------|
|      us |    (null) |         10 |
|      UK |        10 |         12 |
|  france |        12 |     (null) |
  

Комментарии:

1. c.company IN (t.seller, t.buyer) это сокращение от c.company = t.seller OR c.company = t.buyer .

Ответ №2:

Для повышения эффективности, возможно, было бы лучше сводить данные, а не использовать in или or в a join . Итак, я бы рекомендовал:

 select c.country,
       sum(amount_buyer) as sum_buyer,
       sum(amount_seller) as sum_seller
from trades t cross join lateral
     (values (t.seller, t.amount, 0),
             (t.buyer, 0, t.amount)
     ) v(company, amount_seller, amount_buyer) join
     companies c
     on c.company = v.company
group by c.country;