首页 > 试题广场 >

分析每个员工在不同项目中的绩效情况

[编程题]分析每个员工在不同项目中的绩效情况
  • 热度指数:151 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
【背景】:公司需要分析每个员工在不同项目中的绩效情况,现在需要你根据下面三个数据表,查询出每个员工在 2024 年上半年的绩效总评分以及在不同部门的绩效排名。
【原始表】:
employees(员工)表:
  • employee_id (员工 ID): 员工的唯一标识符
  • employee_name (员工姓名): 员工的姓名
  • department (部门): 员工所属的部门
projects(项目)表:
  • project_id (项目 ID): 项目的唯一标识符
  • project_name (项目名称): 项目的名称
  • start_date (开始日期): 项目的开始日期
performance(绩效)表:
  • performance_id (绩效 ID): 绩效的唯一标识符
  • employee_id (员工 ID): 员工的唯一标识符,用于关联员工表中的员工
  • project_id (项目 ID): 项目的唯一标识符,用于关联项目表中的项目
  • performance_score (绩效评分): 员工在该项目中的绩效评分
【要求】:根据上面这三个表格,查询每个员工的绩效情况,包含的字段:员工 ID、员工姓名、该员工在 2024 年上半年的绩效评分, 该员工在所属项目排名,该员工所属部门名称,该员工所属项目名称。查询出来的数据按照项目ID升序排列,再按照在所属项目的绩效排名升序排列,排名一致的按照员工ID升序排列。
  • employee_id: 员工的唯一标识符。
  • employee_name: 员工的姓名。
  • first_half_2024_score: 2024 年上半年的绩效评分。上半年 [ 2024-01-01——2024-07-01)
  • project_group_rank: 在所属项目的绩效排名。
  • department: 所属部门。
  • project_group: 所属项目组。
【示例】
employees(员工)表:

projects(项目)表:
performance(绩效)表:
【按照要求查询出来的表】
【解释】
上述示例中项目C的时间是2023-03-01,在查询要求中查询的是2024年上半年的绩效,所以在查询数据中不展示。对于项目组A2024-01-01有3个员工在项目中工作,分别是是employee_id 1、5、2,按照成绩排序顺序是1、5、2,1、5成绩一致都是80,然后再按照employee_id升序排列
示例1

输入

DROP TABLE IF EXISTS employees;
DROP TABLE IF EXISTS projects;
DROP TABLE IF EXISTS performance;
-- 创建表
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    employee_name VARCHAR(50),
    department VARCHAR(50)
);

CREATE TABLE projects (
    project_id INT PRIMARY KEY,
    project_name VARCHAR(50),
    start_date DATE
);

CREATE TABLE performance (
    performance_id INT PRIMARY KEY,
    employee_id INT,
    project_id INT,
    performance_score INT
    
);

-- 插入数据
INSERT INTO employees (employee_id, employee_name, department)
VALUES (1, '张三', '研发部'),
       (2, '李四', '市场部'),
       (3, '王五', '市场部'),
       (4, '赵六', '研发部'),
       (5, '周七', '研发部');

INSERT INTO projects (project_id, project_name, start_date)
VALUES (1, '项目 A', '2024-01-01'),
       (2, '项目 B', '2024-03-01'),
       (3, '项目 C', '2023-03-01');

INSERT INTO performance (performance_id, employee_id, project_id, performance_score)
VALUES (1, 1, 1, 80),
       (2, 2, 1, 70),
       (3, 3, 2, 95),
       (4, 4, 2, 88),
       (5, 5, 1, 80),
       (6, 5, 3, 80),
       (7, 1, 2, 88);

select * from employees;
select * from projects;
select * from performance;

输出

employee_id|employee_name|first_half_2024_score|project_group_rank|department|project_group
1|张三|80|1|研发部|项目 A
5|周七|80|2|研发部|项目 A
2|李四|70|3|市场部|项目 A
3|王五|95|1|市场部|项目 B
1|张三|88|2|研发部|项目 B
4|赵六|88|3|研发部|项目 B
SELECT E.employee_id,
       employee_name,
       performance_score AS first_half_2024_score,
       row_number()over(partition by project_name order by performance_score DESC) AS project_group_rank,
       department,
       project_name AS project_group
FROM performance AS PER
JOIN employees AS E ON PER.employee_id = E.employee_id
JOIN projects AS P ON P.project_id = PER.project_id
WHERE start_date BETWEEN '2024-01-01' AND '2024-06-30'
ORDER BY P.project_id,project_group_rank,E.employee_id;
发表于 2025-06-18 14:52:32 回复(0)