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后的输出结果如下:
| 员工姓名 | 总津贴 | 总扣款 | 实发薪资 |
|---|---|---|---|
| ALI | 1000 | 500 | 500 |
| ASAD | 1000 | 400 | 600 |
| JAMSHAID | 2400 | 600 | 1800 |
- 如果需要筛选特定类型的津贴/扣款(比如只统计你提到的基本工资、绩效、银行代扣等类型),可以在
WHERE条件中追加对应的ALLO_DETAILS/DED_DETAILS过滤规则即可。
内容的提问来源于stack exchange,提问作者JAMSHAID
相关产品推荐
相关产品推荐

