详解力扣高频SQL50题之1731. 每位经理的下属员工数量【简单】

传送门:1731. 每位经理的下属员工数量

题目

表:Employees

±------------±---------+
| Column Name | Type |
±------------±---------+
| employee_id | int |
| name | varchar |
| reports_to | int |
| age | int |
±------------±---------+

employee_id 是这个表中具有不同值的列。
该表包含员工以及需要听取他们汇报的上级经理的 ID 的信息。 有些员工不需要向任何人汇报(reports_to 为空)。

对于此问题,我们将至少有一个其他员工需要向他汇报的员工,视为一个经理。

编写一个解决方案来返回需要听取汇报的所有经理的 ID、名称、直接向该经理汇报的员工人数,以及这些员工的平均年龄,其中该平均年龄需要四舍五入到最接近的整数。

返回的结果集需要按照 employee_id 进行排序。

结果的格式如下:

示例 1:

输入:
Employees 表:

employee_id name reports_to age
9 Hercy null 43
6 Alice 9 41
4 Bob 9 36
2 Winston null 37

输出:

employee_id name reports_count average_age
9 Hercy 2 39

解释:
Hercy 有两个需要向他汇报的员工, 他们是 Alice and Bob. 他们的平均年龄是 (41+36)/2 = 38.5, 四舍五入的结果是 39.
示例 2:

输入:
Employees 表:

employee_id name reports_to age
1 Michael null 45
2 Alice 1 38
3 Bob 1 42
4 Charlie 2 34
5 David 2 40
6 Eve 3 37
7 Frank null 50
8 Grace null 48

输出:

employee_id name reports_count average_age
1 Michael 2 40
2 Alice 2 37
3 Bob 1 37

解析

这题解法和570. 至少有5名直接下属的经理类似,就长话短说了,自连接,将表拆分为经理表和员工表,由于返回字段有id和name,所以要对经理id和name都分组,再求count()和avg(),最后别忘记对经理id排序。

算法(标准SQL)

自连接职员表,分为经理表和员工表,其中经理表id=员工表的报告id,再对经理id和name分组,求count()和avg(年龄),最后对经理id升序排序,返回经理id,经理姓名,报告数,平均年龄。

代码(标准SQL)

select mag.Employee_id,mag.name,
count(*) as reports_count,
round(avg(emp.age)) as average_age
from Employees mag
join Employees emp
on mag.Employee_id=emp.reports_to
group by mag.Employee_id,mag.name
order by mag.employee_id;

你可能感兴趣的:(详解力扣高频SQL50题,leetcode,sql,oracle)