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

MySQL实现多行数据合并为单行并统计金额总和与差值的方法

实现方案

直接按员工维度分组,配合聚合函数统计即可,完整SQL如下:

SELECT 
    `EMPLOYEES`.`EMP_NAME` AS 员工姓名,
    SUM(`ALLOCATION`.`ALLO_AMOUNT`) AS 总津贴,
    SUM(`DEDUCATION`.`DED_AMOUNT`) AS 总扣款,
    SUM(`ALLOCATION`.`ALLO_AMOUNT`) - SUM(`DEDUCATION`.`DED_AMOUNT`) AS 实发薪资
    -- 若需要查看明细可追加下面两行
    -- , GROUP_CONCAT(DISTINCT `ALLOCATION`.`ALLO_DETAILS` SEPARATOR '、') AS 津贴明细
    -- , GROUP_CONCAT(DISTINCT `DEDUCATION`.`DED_DETAILS` SEPARATOR '、') AS 扣款明细
FROM `EMPLOYEES`
INNER JOIN `SALARY` ON `EMPLOYEES`.`EMP_ID` = `SALARY`.`EMP_ID`
INNER JOIN `ALLOCATION` ON `ALLOCATION`.`ALLO_ID` = `SALARY`.`ALLO_ID`
INNER JOIN `DEDUCATION` ON `DEDUCATION`.`DED_ID` = `SALARY`.`DED_ID`
GROUP BY `EMPLOYEES`.`EMP_ID`, `EMPLOYEES`.`EMP_NAME`;
说明
  • 用显式INNER JOIN替代原SQL的隐式逗号连接,逻辑更清晰,避免误写产生笛卡尔积
  • 分组字段同时用EMP_ID和EMP_NAME,避免出现重名员工统计错误
  • 按照你给出的测试数据,执行上述SQL后的输出结果如下:
员工姓名总津贴总扣款实发薪资
ALI1000500500
ASAD1000400600
JAMSHAID24006001800
  • 如果需要筛选特定类型的津贴/扣款(比如只统计你提到的基本工资、绩效、银行代扣等类型),可以在WHERE条件中追加对应的ALLO_DETAILS/DED_DETAILS过滤规则即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:36:04