SQL实现:按emp_id计算员工薪资百分比差异
问题需求
现有test1表,表结构及插入数据的SQL语句如下:
CREATE TABLE test1 (in_date date, emp_id int , salary int); INSERT INTO test1 (in_date, emp_id, salary) VALUES ('01-01-2020',1,4000), ('01-01-2020',2,3000), ('01-01-2020',3,6000), ('01-01-2020',4,9000), ('02-01-2020',1,2000), ('02-01-2020',2,5000), ('02-01-2020',3,4200), ('02-01-2020',4,8500);
对应的数据表内容:
| In_date | emp_id | salary |
|---|---|---|
| 01-01-2020 | 1 | 4000 |
| 01-01-2020 | 2 | 3000 |
| 01-01-2020 | 3 | 6000 |
| 01-01-2020 | 4 | 9000 |
| 02-01-2020 | 1 | 2000 |
| 02-01-2020 | 2 | 5000 |
| 02-01-2020 | 3 | 4200 |
| 02-01-2020 | 4 | 8500 |
需要编写SQL查询,按emp_id计算薪资的百分比变化,输出格式如下:
| emp_id | per_diff_salary |
|---|---|
| 1 | 50% |
| 2 | -67% |
| 3 | 30% |
| 4 | 6% |
解决方案
核心逻辑
每个员工有两条时间序列的薪资记录:01-01-2020为初始薪资,02-01-2020为对比薪资。百分比变化计算公式为:((初始薪资 - 对比薪资) / 初始薪资) * 100,最终取整并拼接百分号。
SQL查询语句
SELECT emp_id, CONCAT( ROUND(((t1.salary - t2.salary) / t1.salary) * 100), '%' ) AS per_diff_salary FROM test1 t1 JOIN test1 t2 ON t1.emp_id = t2.emp_id AND t1.in_date = '01-01-2020' AND t2.in_date = '02-01-2020' ORDER BY emp_id;
语句说明
- 自连接匹配数据:将
test1表分别作为t1(初始薪资表)和t2(对比薪资表),通过emp_id关联,同时指定两张表的日期条件,确保每个员工的两条记录精准匹配。 - 计算并格式化结果:用公式算出变化率后,通过
ROUND()取整,再用CONCAT()拼接百分号,得到需求的格式。 - 排序输出:按
emp_id排序,与目标输出顺序一致。
内容的提问来源于stack exchange,提问作者Aditya Pillai
相关产品推荐
相关产品推荐

