一、问题描述
表: 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.
复制代码
写一个 SQL
, 报告余额高于 10000
的所有用户的名字和余额. 账户的余额等于包含该账户的所有交易的总和.
返回结果表单没有顺序要求,查询结果格式如下例所示:
题目链接:银行账户概要 II
二、题目要求
样例
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 |
+------------+------------+------------+---------------+
Result table:
+------------+------------+
| name | balance |
+------------+------------+
| Alice | 11000 |
+------------+------------+
Alice 的余额为(7000 + 7000 - 3000) = 11000.
Bob 的余额为1000.
Charlie 的余额为(6000 + 6000 - 4000) = 8000.
复制代码
考察
三、问题分析
这一题可以使用左外连接,常用的如下:
A inner join B:内连接,取交集
A left join B:左外连接,取 A 全部,B 没有对应的值,则为null
A right join B:右外连接,取 B 全部,A 没有对应的值,则为null
A full outer join B:全外连接,取并集,彼此没有对应的值为null
对两个表进行左外连接
之后,按照name
进行聚合分组,将交易的数额全部相加,最后用having
筛选出总和10000
的数据。
四、编码实现
select name,sum(amount) as 'balance'
from Users u
left join Transactions t on u.account=t.account
group by name
having sum(amount)>10000
复制代码
五、测试结果
评论