SQL Server如何将人员分两行存储的出入记录合并为单行展示
SQL Server人员出入记录行合并解决方案
你当前查询出现NULL、无法合并行的核心原因是:CASE判断是逐行生效的,单条行记录要么是入场(Id_Tp_Acso=2)要么是离场(Id_Tp_Acso=1),所以必然有一个CASE的返回值为NULL,且因为出入两条记录的原始Fecha_Hora值不同,直接用DISTINCT或GROUP BY无法将两条记录合并。
修正后的查询语句
假设ICA.Id_IE为人员唯一标识字段,你可以根据实际需求补充人员姓名等需要展示的维度字段:
SELECT ICA.Id_IE, -- 人员唯一标识,可根据实际业务补充姓名等其他人员字段 Convert(nvarchar,ICA.Fecha_Hora,106) as 'Fecha', MAX(CASE WHEN ITA.Id_Tp_Acso = 2 THEN convert(nvarchar,ICA.Fecha_Hora ,108) END) AS 'Entrada', MAX(CASE WHEN ITA.Id_Tp_Acso = 1 THEN convert(nvarchar,ICA.Fecha_Hora ,108) END) AS 'Salida' FROM Intranet.DBO.Int_Control_Acceso ICA INNER JOIN Intranet.DBO.Int_Tipo_Acceso ITA ON ITA.Id_Tp_Acso = ICA.Id_Tp_Acso INNER JOIN Bit_V3.dbo.BIO_Programacion_Detalle BPD ON ICA.Id_IE = BPD.Id_IE WHERE CONVERT(date,ICA.Fecha_Hora) BETWEEN ISNULL('25/05/2021','01/01/2020') and ISNULL('25/05/2021',GETDATE()) AND CONVERT(date,BPD.FechaInicio) BETWEEN ISNULL('25/05/2021','01/01/2020') and ISNULL('25/05/2021',GETDATE()) GROUP BY ICA.Id_IE, Convert(nvarchar,ICA.Fecha_Hora,106)
改动说明
- 对
Entrada和Salida字段套MAX()聚合函数,会自动忽略NULL值,提取出同组内非空的出入场时间 - 移除了原始的逐行时间字段
ICA.Fecha_Hora,按日期、人员ID分组,保证同一个人同一天的出入记录被合并到同一行 - 修正了原WHERE条件末尾缺失的右括号语法错误
如果存在同一个人同一天多次出入的场景,需要额外用窗口函数先对出入场记录按时间顺序做配对,再合并行,可根据实际业务场景调整逻辑。
内容的提问来源于stack exchange,提问作者cosmos multi
相关产品推荐
相关产品推荐

