MySQL计算入职满2年员工的平均薪资涨幅百分比
计算员工入职满2年后的平均薪资涨幅百分比
这是个很典型的薪资数据分析需求,我来一步步拆解怎么用SQL实现它:
需求拆解
我们需要对比两个关键时间点的薪资:
- 员工入职当天生效的初始薪资
- 员工入职满2周年当天(或该时间点正在生效的薪资)
然后计算每个符合条件员工的薪资涨幅百分比,最后求这些百分比的平均值。
表结构回顾
workers表:核心字段是worker_id(唯一标识员工)、hire_date(员工入职日期)salaries表:记录员工的薪资变动历史,worker_id关联员工,salary是薪资数额,from_date/to_date标记该薪资的生效时间段
实现SQL代码
SELECT AVG(((s2.salary - s1.salary) / s1.salary) * 100) AS avg_salary_increase_pct FROM workers w JOIN salaries s1 ON w.worker_id = s1.worker_id AND s1.from_date = w.hire_date -- 关联入职时的初始薪资 JOIN salaries s2 ON w.worker_id = s2.worker_id AND s2.from_date <= DATE_ADD(w.hire_date, INTERVAL 2 YEAR) -- 薪资在入职2年时已生效 AND s2.to_date >= DATE_ADD(w.hire_date, INTERVAL 2 YEAR) -- 薪资在入职2年时仍有效 WHERE DATE_ADD(w.hire_date, INTERVAL 2 YEAR) <= CURDATE(); -- 过滤入职未满2年的员工
代码关键点解释
- 入职满2年日期计算:用
DATE_ADD(w.hire_date, INTERVAL 2 YEAR)得到员工入职两周年的具体日期 - 初始薪资关联:通过
s1.from_date = w.hire_date精准匹配员工入职当天生效的薪资记录 - 2年后薪资匹配:通过
s2.from_date <= 入职2年日期和s2.to_date >= 入职2年日期,找到该时间点正在生效的薪资(因为薪资是区间生效的,不是每天都有记录) - 涨幅计算:
((s2.salary - s1.salary) / s1.salary) * 100得到单个员工的涨幅百分比,再用AVG()求平均值 - 过滤无效数据:最后用
WHERE子句排除那些入职还没满2年的员工,避免无意义的计算
注意事项
- 如果有些员工在入职2年时没有生效的薪资记录(比如刚好那天换了薪资但数据没衔接好),这类记录会被
JOIN自动排除,不会影响平均值的准确性 - 如果需要保留那些有初始薪资但2年后无薪资数据的员工(比如已离职),可以把
JOIN改成LEFT JOIN,并在AVG()里用IFNULL处理NULL值(不过通常这类情况我们会过滤掉)
内容的提问来源于stack exchange,提问作者user9609362
相关产品推荐
相关产品推荐

