Вернуть два значения, используя один sql в PostgreSQL - PullRequest
1 голос
/ 22 апреля 2020

Моя таблица с пользовательскими транзакциями в postgres выглядит следующим образом:

   id  sender_id    recipient_id           amount_money
   --- -----------  ---------------------- -----------------
   1   1            2                      60.00
   2   1            2                      15.00
   3   2            1                      35.00

У пользователя с идентификатором 2 есть 75,00 доходов и 35,00 расходов

Я хотел бы получить результат примерно так:

[{name: 'revenues', value: 75.00}, {name:'expenses', value: 35.00}]

Можно ли сделать такой результат в самом postgres sql? Я думаю о функции array_agg. Если это трудно, я могу обработать это в javascript, но мне нужен запрос, который вернет мне два значения: доходы и расходы

1 Ответ

2 голосов
/ 22 апреля 2020

Вот один метод:

select sum(amount) filter (where recipient_id = 2) as revenues,
       sum(amount) filter (where sender_id = 2) as expenses
from transactions t
where 2 in (sender_id, recipient_id);

Если вы хотите сделать это для более чем одного человека, то вы можете использовать боковое соединение и агрегацию:

select v.id, sum(v.revenue) as revenues, sum(v.expenses) as expenses
from transactions t cross join lateral
     (values (t.recipient_id, t.amount, 0), (t.sender_id, 0, t.amount)
     ) v(id, revenue, expense)
group by v.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...