写点什么

数据库每日一题 --- 第 25 天:银行账户概要 II

作者:知心宝贝
  • 2022 年 7 月 17 日
  • 本文字数:1264 字

    阅读完需:约 4 分钟

数据库每日一题---第25天:银行账户概要 II

一、问题描述

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.
复制代码

考察

1.聚合函数、外连接2.建议用时10~25min
复制代码

三、问题分析

这一题可以使用左外连接,常用的如下:


  • 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 uleft join Transactions t on u.account=t.accountgroup by namehaving sum(amount)>10000
复制代码

五、测试结果




发布于: 刚刚阅读数: 4
用户头像

知心宝贝

关注

公众号:穿越计算机的迷雾 2022.03.07 加入

生于尘埃 溺于人海 死于理想高台

评论

发布
暂无评论
数据库每日一题---第25天:银行账户概要 II_数据库_知心宝贝_InfoQ写作社区