该题目来源于力扣:
1587. 银行账户概要 II - 力扣(LeetCode)
题目要求:
表: 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 的所有用户的名字和余额. 账户的余额等于包含该账户的所有交易的总和。返回结果表单 无顺序要求 。查询结果格式如下例所示。示例 1:输入:
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 |
+------------+------------+
解释:
Alice 的余额为(7000 + 7000 - 3000) = 11000.
Bob 的余额为1000.
Charlie 的余额为(6000 + 6000 - 4000) = 8000.
思路流程:
-
将两张表进行链接
-
按照U表的账户进行分组
-
分组后,在having的语段里写聚合函数SUM,来进行布尔值的判断(为什么聚合函数不可以在WHERE里写呢?因为WHERE函数的执行顺序在groupby之前,表达对原数据集数据的筛选,这里用聚合函数没有逻辑)
代码实现:
# Write your MySQL query statement below
SELECT U.name,SUM(T.amount) AS balance
FROM Users U
JOIN Transactions T
ON U.account =T.account
group by U.account
having SUM(T.amount) > 10000