You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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_IdA_NameValue
e-001Basic5000
e-001Bonus1000
e-002Basic6000

Deduction表有如下数据:

Emp_IdD_NameValue
e-001Insurance300
e-002Loan500

执行上面的SQL后,会得到结果:

Emp_IdBasicBonusInsuranceLoan
e-00150001000300NULL
e-0026000NULLNULL500

如果你的薪资项名称和上面假设的不一致,只需要修改CASE WHEN中的字符串匹配值即可。

内容的提问来源于stack exchange,提问作者Pramono

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:01:04