首页 > 解决方案 > 在 PostgreSQL 中使用一个 sql 返回两个值

问题描述

我在 postgres 中的用户事务表如下所示:

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

ID 为 2 的用户有 75.00 的收入和 35.00 的费用

我想得到类似这样的结果:

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

这样的结果可以在 postgres sql 本身中完成吗?我想到了 array_agg 函数。如果很难,我可以用 javascript 处理它,但我需要一个查询,它会返回两个值:收入和费用

标签: sqlpostgresql

解决方案


这是一种方法:

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;

推荐阅读