题目描述

(通过次数402 | 提交次数521,通过率77.16%)

表:Salesperson
+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| salesperson_id | int     |
| name           | varchar |
+----------------+---------+
sales_person_id 是这个表的主键。
这个表中的每一行都显示一个销售人员的 ID。
表:Customer
+----------------+------+
| Column Name    | Type |
+----------------+------+
| customer_id    | int  |
| salesperson_id | int  |
+----------------+------+
customer_id 是这个表的主键。
salesperson_id 是一个来自于 Salesperson 表的外键
Customer 表中的每一行都显示了一个客户的 ID 和销售人员的 ID。
表:Sales
+-------------+------+
| Column Name | Type |
+-------------+------+
| sale_id     | int  |
| customer_id | int  |
| price       | int  |
+-------------+------+
sale_id 是这个表的主键。
customer_id 是一个来自于 Customer 表的外键。
Sales 表中的每一行都显示了一个客户的 ID 以及他们在 sale_id 指代的交易中所支付的金额。

编写一个 SQL 查询用来报告每个销售人员的客户所支付的价格总和。如果销售人员没有任何客户,则总值应该为 0 。
以 任意顺序 返回结果表。
查询结果格式如下所示。

示例 1:
输入: 
Salesperson 表:
+----------------+-------+
| salesperson_id | name  |
+----------------+-------+
| 1              | Alice |
| 2              | Bob   |
| 3              | Jerry |
+----------------+-------+
Customer 表:
+-------------+----------------+
| customer_id | salesperson_id |
+-------------+----------------+
| 1           | 1              |
| 2           | 1              |
| 3           | 2              |
+-------------+----------------+
Sales 表:
+---------+-------------+-------+
| sale_id | customer_id | price |
+---------+-------------+-------+
| 1       | 2           | 892   |
| 2       | 1           | 354   |
| 3       | 3           | 988   |
| 4       | 3           | 856   |
+---------+-------------+-------+
输出: 
+----------------+-------+-------+
| salesperson_id | name  | total |
+----------------+-------+-------+
| 1              | Alice | 1246  |
| 2              | Bob   | 1844  |
| 3              | Jerry | 0     |
+----------------+-------+-------+
解释: 
Alice 是客户 1 和客户 2 的销售人员。
  - 客户 1 一次购买花费了 354。
  - 客户 2 一次购买花费了 892。
Alice 的总数是 354 + 892 = 1246。

Bob 是客户 3 的销售人员。
  - 客户 3 一次购买花费了 988,另一次购买花费了 856。
Bob 的总数是 988 + 856 = 1844。

Jerry 没有客户。
Jerry 的总数是 0。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/calculate-the-influence-of-each-salesperson

//测试数据
Create table If Not Exists Salesperson (salesperson_id int, name varchar(30));
Create table If Not Exists Customer (customer_id int, salesperson_id int);
Create table If Not Exists Sales (sale_id int, customer_id int, price int);

insert into Salesperson (salesperson_id, name) values ('1', 'Alice');
insert into Salesperson (salesperson_id, name) values ('2', 'Bob');
insert into Salesperson (salesperson_id, name) values ('3', 'Jerry');

insert into Customer (customer_id, salesperson_id) values ('1', '1');
insert into Customer (customer_id, salesperson_id) values ('2', '1');
insert into Customer (customer_id, salesperson_id) values ('3', '2');

insert into Sales (sale_id, customer_id, price) values ('1', '2', '892');
insert into Sales (sale_id, customer_id, price) values ('2', '1', '354');
insert into Sales (sale_id, customer_id, price) values ('3', '3', '988');
insert into Sales (sale_id, customer_id, price) values ('4', '3', '856');

解题思路

这道题涉及的表比较多。
Salesperson表中保存了所有的销售人员。
Customer表中保存了所有的客户,以及服务客户的销售人员ID。
Sales表中保存了所有客户的订单信息,包括订单金额。
题目要求:计算出每个销售人员的总销售额。
那么,首先,我们需要知道每个销售人员服务的所有客户。
然后,通过客户获取客户的所有订单。
最后,根据销售人员分组汇总统计即可。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select
    a.salesperson_id,
    a.name,
    coalesce(sum(c.price),0) total
from Salesperson a
left join Customer b
on a.salesperson_id = b.salesperson_id
left join Sales c
on b.customer_id = c.customer_id
group by a.salesperson_id;

picture loss