#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;