SQL:
select u.name, sum(t.amount) balance
from users u
join transactions t
on u.account = t.account
group by u.account
having sum(t.amount) > 10000
描述:
表: Users
+--------------+---------+ | Column Name | Type | +--------------+---------+ | account | int | | name | varchar | +--------------+---------+ account 是该表的主键(具有唯一值的列)。 该表的每一行都包含银行中每个用户的帐号。 表中不会有两个用户具有相同的名称。
表: Transactions
+---------------+---------+ | Column Name | Type | +---------------+---------+ | trans_id | int | | account | int | | amount | int | | transacted_on | date | +---------------+---------+ trans_id 是该表主键(具有唯一值的列)。 该表的每一行包含了所有账户的交易改变情况。 如果用户收到了钱, 那么金额是正的; 如果用户转了钱, 那么金额是负的。 所有账户的起始余额为 0。
编写解决方案, 报告余额高于 10000 的所有用户的名字和余额. 账户的余额等于包含该账户的所有交易的总和。
示例:
输入: Users
table: +------------+--------------+ | account | name | +------------+--------------+ | 900001 | Alice | | 900002 | Bob | | 900003 | Charlie | +------------+--------------+Transactions
table: +------------+------------+------------+---------------+ | trans_id | account | amount | transacted_on | +------------+------------+------------+---------------+ | 1 | 900001 | 7000 | 2020-08-01 | | 2 | 900001 | 7000 | 2020-09-01 | | 3 | 900001 | -3000 | 2020-09-02 | | 4 | 900002 | 1000 | 2020-09-12 | | 5 | 900003 | 6000 | 2020-08-07 | | 6 | 900003 | 6000 | 2020-09-07 | | 7 | 900003 | -4000 | 2020-09-11 | +------------+------------+------------+---------------+
输出:
+------------+------------+| name | balance |
+------------+------------+
| Alice | 11000 |
+------------+------------+
分析:
这道题的关键在于对account做分组操作并算出其amount的值做判断输出,即group by account having sum(amount) > 10000,将其作为连接条件连接两表即可。
select u.name, sum(t.amount) balance
from users u
join transactions t
on u.account = t.account
group by u.account
having sum(t.amount) > 10000