题目描述

(通过次数15,956 | 提交次数22,795,通过率70.00%)

项目表Project:
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| project_id  | int     |
| employee_id | int     |
+-------------+---------+
主键为 (project_id, employee_id)。
employee_id 是员工表 Employee 表的外键。
员工表Employee:
+------------------+---------+
| Column Name      | Type    |
+------------------+---------+
| employee_id      | int     |
| name             | varchar |
| experience_years | int     |
+------------------+---------+
主键是 employee_id。

请写一个 SQL语句,查询每一个项目中员工的平均工作年限,精确到小数点后两位。
查询结果的格式如下:
Project 表:
+-------------+-------------+
| project_id  | employee_id |
+-------------+-------------+
| 1           | 1           |
| 1           | 2           |
| 1           | 3           |
| 2           | 1           |
| 2           | 4           |
+-------------+-------------+
Employee 表:
+-------------+--------+------------------+
| employee_id | name   | experience_years |
+-------------+--------+------------------+
| 1           | Khaled | 3                |
| 2           | Ali    | 2                |
| 3           | John   | 1                |
| 4           | Doe    | 2                |
+-------------+--------+------------------+
Result 表:
+-------------+---------------+
| project_id  | average_years |
+-------------+---------------+
| 1           | 2.00          |
| 2           | 2.50          |
+-------------+---------------+
第一个项目中,员工的平均工作年限是 (3 + 2 + 1) / 3 = 2.00;第二个项目中,员工的平均工作年限是 (3 + 2) / 2 = 2.50

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/project-employees-i
//测试数据
Create table If Not Exists Project (project_id int, employee_id int);
Create table If Not Exists Employee (employee_id int, name varchar(10), experience_years int);

insert into Project (project_id, employee_id) values ('1', '1');
insert into Project (project_id, employee_id) values ('1', '2');
insert into Project (project_id, employee_id) values ('1', '3');
insert into Project (project_id, employee_id) values ('2', '1');
insert into Project (project_id, employee_id) values ('2', '4');

insert into Employee (employee_id, name, experience_years) values ('1', 'Khaled', '3');
insert into Employee (employee_id, name, experience_years) values ('2', 'Ali', '2');
insert into Employee (employee_id, name, experience_years) values ('3', 'John', '1');
insert into Employee (employee_id, name, experience_years) values ('4', 'Doe', '2');

解题思路

Project表保存了每个项目下所有的员工ID。

Employee表保存了每个员工的基本信息,包括员工的工作年限。

题目要求:查询每个项目下所有员工的平均工作年限。

因为项目ID保存在Project表,而员工的工作年限保存在Employee表,所以需要将两张表关联起来。又因为Employee表保存了所有员工的信息,所以这里使用INNER JOIN或LEFT JOIN都可以。

然后,在关联出的结果中,使用project_id分组,求出员工工作年限experience_years的平均值即可。

注意,题目要求,对平均值保留两位小数,可以使用ROUND函数实现。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select
    a.project_id,
    round(avg(b.experience_years),2) average_years
from Project a
inner join Employee b
on a.employee_id = b.employee_id
group by a.project_id;
picture loss