题104:
根据下面两表写一条 SQL 语句,查询:
- user_id 用户 ID
- user_name 用户名
- credit 完成交易后的余额
- credit_limit_breached 检查是否透支 (“Yes” 或 “No”)
其中:
- Users表:user_id 是主键,表中的每一列包含每一个用户当前的额度信息;
- Transactions表:trans_id 是主键,表中的每一列包含银行的交易信息,ID 为 paid_by 的用户给 ID 为 paid_to 的用户转账。
解题思路:
(1)分别根据出账和进账分组求和,支出金额取反;
(2)利用union将(1)的进账和出账联合,再次分组求出每个用户的账户总金额;
(3)做左连接,还需要考虑null求和。
select
u.user_id,
u.user_name,
credit+ifnull(`amts`,0) credit,
if((credit+ifnull(`amts`,0))<0,'Yes','No') credit_limit_breached
from Users u
left join (
select user_id,sum(amt) amts from (
(select paid_by user_id,-sum(amount) amt from transactions group by paid_by)
union
(select paid_to user_id,sum(amount) amt from transactions group by paid_to)
) t group by user_id) t
on u.user_id = t.user_id;