mysql - 查询父表时如何获取子表列的总和?
问题描述
我有两张桌子
账户表(账户)
id name
1 Account 1
2 Account 2
3 Account 3
4 Account 2
事务表(事务)
id account_id type amount datetime
1 1 credit 500 2020-04-01 06:00:00
2 1 credit 300 2020-04-01 06:00:00
3 2 credit 100 2020-04-01 06:00:00
4 2 debit 50 2020-04-01 06:00:00
5 1 debit 600 2020-04-01 06:00:00
6 3 credit 1000 2020-04-01 06:00:00
7 1 credit 100
id, name, balance
我的目标是在一次查询中获得帐户。余额将根据SUM of Credit Amount - SUM of Debit Amount
给定帐户的交易表计算。
目标输出
id name balance
1 Account 1 300
2 Account 2 50
3 Account 3 1000
4 Account 4 0
可能的查询
SELECT id, name, ((SELECT SUM(amount) FROM transaction WHERE type = 'credit' AND account_id = {ACCOUNT_ID} ) - (SELECT SUM(amount) FROM transaction WHERE type = 'debit' AND account_id = {ACCOUNT_ID} )) as balance
是否可以在一个查询中执行此操作,如果可以,如何执行。
解决方案
您可以在派生表中进行聚合,以避免必须按顶级字段进行分组的问题。例如:
SELECT a.id, a.name, COALESCE(b.balance, 0) AS balance
FROM account a
LEFT JOIN (
SELECT account_id,
SUM(CASE WHEN type='credit' THEN amount ELSE 0 END) -
SUM(CASE WHEN type='debit' THEN amount ELSE 0 END) AS balance
FROM transaction
GROUP BY account_id
) b ON b.account_id = a.id
输出:
id name balance
1 Account 1 300
2 Account 2 50
3 Account 3 1000
4 Account 2 0
推荐阅读
- angular-ui-grid - ui.grid 在 gridApi 上使用 $scope 在 $scope 上遇到错误未定义
- owl - 将时间本体与传感器数据结合使用
- sql-server - 带有 foreach 的 SQL Server 存储过程
- kubernetes - 在 DCOS 1.11 上使用 Apache Flink 和 Kubernetes 进行欺诈检测
- php - 是否可以将正则表达式捕获组作为变量?
- java - 如何打印XML中前十个数据的列表
- python - 如果它是在多个级别上的,我如何批量从 ElasticSearch 中获取信息?
- angular - 如何获取在 Angular 5 客户端显示的 pdf 应用程序中填充的数据?
- google-apps-script - 调用 saveAndClose 后如何重新打开活动文档?
- java - 为什么即使我的程序没有创建任何新对象,堆利用率也会随着时间的推移而增加?