LeetCode #银行账户概要 II

125 阅读3分钟

一、题目

表: 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 的所有用户的名字和余额. 账户的余额等于包含该账户的所有交易的总和.

返回结果表单没有顺序要求.

查询结果格式如下例所示.

 

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.

二、解题思路

创建数据表

根据题意创建两个数据表并填充数据

CREATE TABLE IF NOT EXISTS Users (
	account INT, 
	NAME VARCHAR(20)
);
CREATE TABLE IF NOT EXISTS Transactions (
	trans_id INT, 
	account INT, 
	amount INT, 
	transacted_on DATE
);

INSERT INTO Users VALUES
(900001, 'Alice'),
(900002, 'Bob'),
(900003, 'Charlie');

INSERT INTO Transactions VALUES
(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');

解题

  • 根据题意得知,当前三个问题,第一个比较简单,就是为所有用户找到自己的账户,第二个问题是计算该账户的所有交易总额,第三个问题是计算余额高于10000的用户
  • 第一个问题是找所有用户的账户,这个是用左连接查询,用户表作为左表,条件是u.account = t.account
  • 第二个问题,计算每个账户的交易总额,这里使用分组查询加sum()的方式,SUM(amount) balance,得到每个用户的交易总额
  • 第三个问题,在当前数据集的基础上可以选择做一个假表再进行一次查询,也可以是用having再进行查询
  • 最后执行结果
SELECT NAME, SUM(amount) balance
FROM Users u LEFT JOIN Transactions t ON u.account = t.account
GROUP BY NAME
HAVING balance > 10000;
  • 显示结果

image.png

三、执行语句

group + having

image.png

四、总结

  • left join on : 左连接查询,查询坐标所有数据,然后显示右表符合条件的数据
  • group by: 对表进行分组查询
  • having: 对where条件的查询的进一步查询
  • sum(): 对字段的求和计算

这里的主要问题是分析所要求的问题是啥,然后分步骤一步一步解决。