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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:48:02