SQL Server:如何将Entrada与Salida日期合并到同一行?
解决打卡记录合并到同一行的问题
Hey Jose, 我明白你的需求了——当前查询会把员工的「上班(Entrada)」和「下班(Salida)」记录拆分成两行,现在要把它们合并成同一行展示。我们可以通过聚合函数结合分组的方式来实现这个目标,具体方案如下:
修改后的查询语句
SELECT e.IdEmpleado, e.Cedula, e.Nombre, e.Apellido, -- 提取当天的上班日期(自动忽略NULL值) MAX(CASE mo.Sentido WHEN 'Entrada' THEN CAST(mo.FechaHora AS DATE) END) AS Entrada, -- 提取当天的下班日期(自动忽略NULL值) MAX(CASE mo.Sentido WHEN 'Salida' THEN CAST(mo.FechaHora AS DATE) END) AS Salida FROM BAMBA.dbo.EMPLEADO e LEFT JOIN BAMBA.dbo.MARCACIONES_PARA_LIQUIDACION mo ON e.IdEmpleado = mo.IdEmpleado AND CAST(mo.FechaHora AS DATE) BETWEEN '2018-04-24' AND '2018-04-24' WHERE e.IdCentroCosto='14' -- 按员工唯一标识分组,确保同一员工的打卡记录合并到一行 GROUP BY e.IdEmpleado, e.Cedula, e.Nombre, e.Apellido
关键逻辑说明
- 聚合函数
MAX():你的CASE语句会在非匹配的记录上返回NULL,MAX()会自动跳过这些无效值,只保留有效的上班/下班日期。如果员工当天只有上班或只有下班记录,对应的列会显示NULL,完全适配你原查询的LEFT JOIN需求。 GROUP BY子句:通过员工的唯一识别信息(IdEmpleado、Cedula等)分组,就能把同一员工的多条打卡记录收拢到同一行中。
额外提示
如果业务需要展示具体的打卡时间(而非仅日期),只需把CAST(mo.FechaHora AS DATE)改成mo.FechaHora即可,聚合函数依然能正常提取有效的时间值。
内容的提问来源于stack exchange,提问作者Jose
相关产品推荐
相关产品推荐

