如何在SQL Server中将多行薪资单合并为单行(含OT处理)
解决方案
可以通过分组聚合的方式实现需求,核心是按员工ID、PSNO、PSDATE分组,用聚合函数提取各字段的有效数据,同时关联加班金额与对应工时:
SELECT 员工ID, PSNO, PSDATE, MAX(基本工资) AS 基本工资, MAX(CASE WHEN 基本工资 IS NOT NULL THEN 工时 ELSE 0 END) AS BASIC_HRS, MAX(住房津贴) AS 住房津贴, MAX(轮班补贴) AS 轮班补贴, MAX(子女补贴) AS 子女补贴, ISNULL(MAX(OT1), 0) AS OT1, ISNULL(MAX(CASE WHEN OT1 IS NOT NULL THEN 工时 ELSE 0 END), 0) AS OT1_HRS, ISNULL(MAX(OT2), 0) AS OT2, ISNULL(MAX(CASE WHEN OT2 IS NOT NULL THEN 工时 ELSE 0 END), 0) AS OT2_HRS, ISNULL(MAX(OT3), 0) AS OT3, ISNULL(MAX(CASE WHEN OT3 IS NOT NULL THEN 工时 ELSE 0 END), 0) AS OT3_HRS, SUM(总薪资) AS 总薪资 FROM 你的薪资视图名称 GROUP BY 员工ID, PSNO, PSDATE;
代码说明:
GROUP BY 员工ID, PSNO, PSDATE:确保同一员工同一结算周期(PSDATE)的数据合并为单行MAX(字段):同一分组内每个薪资字段仅在一行有非空值,MAX会自动忽略NULL提取有效数据CASE WHEN ... THEN 工时:精准匹配对应薪资项的工时记录,比如基本工资对应的工时、OT1对应的工时ISNULL(..., 0):将不存在的加班项(NULL)转为0,匹配期望输出格式SUM(总薪资):将各行分项薪资求和,得到最终总薪资
内容的提问来源于stack exchange,提问作者R Jp
相关产品推荐
相关产品推荐

