- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用
一,原题力扣链接
二,题干
表:
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 | +-------------+---------+---------------+-------------+
三,建表语句
drop table employee;
Create table If Not Exists Employees(employee_id int, name varchar(20), reports_to int, age int);
Truncate table Employees;
insert into Employees (employee_id, name, reports_to, age) values ('9', 'Hercy', null, '43');
insert into Employees (employee_id, name, reports_to, age) values ('6', 'Alice', '9', '41');
insert into Employees (employee_id, name, reports_to, age) values ('4', 'Bob', '9', '36');
insert into Employees (employee_id, name, reports_to, age) values ('2', 'Winston', null, '37');
select * from Employees;
四,分析
/* 题解: 员工表: 员工id,姓名,上级id,年龄 要求: 返回员工id 返回姓名 返回 上级的id 返回该上级领导的 员工的平均年龄 四舍五入 返回的结果集需要按照 employee_id 进行排序。 思路一 用自联结 拼接2个表 员工表和上级表 条件 employee-id=report-id 以上级id 分组 和名字分组 求人数次数 然后 avg 年龄 最后对年龄四舍五入一下 */
五,SQL解答
select e1.employee_id as employee_id ,
e1.name as name,
count(e2.employee_id) as reports_count ,
round(avg(e2.age),0) as average_age
from employees e1,employees e2
where e1.employee_id=e2.reports_to
group by e1.employee_id,e1.name order by e1.employee_id;
六,验证
七,知识点总结
总结 自连接查询 然后要很清楚 谁是上级谁是下级 我用员工id = 上级的id 那么我就是上级 也就是e1的id 要求我的下属人数 那么以我的id分组。count 下属的id即可 要求 我下属的年龄的平均值 那么以我的姓名分组 avg 一下即可 要求四舍五入年龄 那么就round 要求 以id排序 那么就order by 自联结练习运用 count 统计次数练习运用 avg 平均数练习运用 order by 排序练习运用
- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用