sql - 在 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 处理它,但我需要一个查询,它会返回两个值:收入和费用
解决方案
这是一种方法:
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;
推荐阅读
- java - 我正在从 java 读取文本文件以插入 oracle DB 表,如何跳过前 2 行?
- c# - 将“WHERE”查询与 LINQ 相结合
- html - 为什么 initial-scale=1.0 使元素左对齐?
- vue.js - 缺少事件以检测何时特定
显示? - php - 如何根据页面模板向 HTML 元素添加类?
- pandas - 未打印从 jupyter notebook 导出为 pdf 的表格
- java - StartActivityForResult 不暂停主活动
- excel - 使用 Excel 宏循环浏览文件夹中的文件
- node.js - Node.js 使用 ejs 显示 mysql 查询
- postgresql - 大数据集的Self Join获取时间区间重叠