如何在MySQL中将三张员工薪资相关表合并为指定格式?
在MySQL中合并三张薪资相关表的实现方案
完全可以实现,核心思路是将键值对结构的Addition和Deduction表行转列,再与Employee表关联得到目标格式的结果。
假设对应关系(需根据你的实际数据调整)
Basic、Bonus属于薪资附加项,对应Addition表的A_Name字段Insurance、Loan属于扣款项,对应Deduction表的D_Name字段
实现SQL语句
SELECT e.Emp_Id, -- 从Addition表提取基本工资和奖金 MAX(CASE WHEN a.A_Name = 'Basic' THEN a.Value ELSE NULL END) AS Basic, MAX(CASE WHEN a.A_Name = 'Bonus' THEN a.Value ELSE NULL END) AS Bonus, -- 从Deduction表提取保险和贷款扣款 MAX(CASE WHEN d.D_Name = 'Insurance' THEN d.Value ELSE NULL END) AS Insurance, MAX(CASE WHEN d.D_Name = 'Loan' THEN d.Value ELSE NULL END) AS Loan FROM Employee e LEFT JOIN Addition a ON e.Emp_Id = a.Emp_Id LEFT JOIN Deduction d ON e.Emp_Id = d.Emp_Id GROUP BY e.Emp_Id;
关键说明
- 使用
LEFT JOIN:确保即使员工没有附加项或扣款项,也不会从结果中被剔除,对应字段会显示NULL CASE WHEN + MAX():实现行转列,因为每个员工针对同一个薪资项应该只有一条记录,用MAX()可以聚合出对应的值(如果有重复记录,SUM()可以用来求和,根据你的业务需求调整)GROUP BY e.Emp_Id:按员工ID分组,确保每个员工只输出一行结果
测试示例
如果你的Addition表有如下数据:
| Emp_Id | A_Name | Value |
|---|---|---|
| e-001 | Basic | 5000 |
| e-001 | Bonus | 1000 |
| e-002 | Basic | 6000 |
Deduction表有如下数据:
| Emp_Id | D_Name | Value |
|---|---|---|
| e-001 | Insurance | 300 |
| e-002 | Loan | 500 |
执行上面的SQL后,会得到结果:
| Emp_Id | Basic | Bonus | Insurance | Loan |
|---|---|---|---|---|
| e-001 | 5000 | 1000 | 300 | NULL |
| e-002 | 6000 | NULL | NULL | 500 |
如果你的薪资项名称和上面假设的不一致,只需要修改CASE WHEN中的字符串匹配值即可。
内容的提问来源于stack exchange,提问作者Pramono
相关产品推荐
相关产品推荐

