sql >> Base de Datos >  >> RDS >> Sqlserver

¿Obtener todos los registros de entrada y salida para cada empleado?

Puede usar una subselección o CTE para obtener los datos ordenados por empleado y usarlos como la tabla de datos principal. Algo similar (adáptalo si es necesario) a esto:

;with ordered as (
select 
    emp_reader_id as empId,
    CONVERT(DATE, dt) as Punch,
    Row_number()
     OVER (PARTITION BY emp_reader_id ORDER BY CONVERT(DATE, dt) ASC) as OrderedPunch
from trnevents
)
SELECT 
    entered.empId, 
    entered.Punch as PunchIn,
    exited.Punch as PunchOut
from
    ordered as entered
    left join ordered as exited on 
        entered.empId = exited.empId
        and entered.OrderedPunch + 1 = exited.OrderedPunch

Explicación:El CTE 'pedido' sí muestra las entradas/salidas de empleados ordenadas por fecha. El ROW_NUMBER se restablece para cada empleado (supongo que emp_reader_id contiene la identificación del empleado) debido a PARTITION BY .

Una vez que obtuve el contador para cada empleado, uno cada marca para cada empleado (primera condición en la combinación izquierda) con la siguiente marca para ese empleado (segunda condición en la combinación izquierda). De esa forma puedo mostrar la columna de entrada y la de salida (el siguiente golpe).

Después de obtener las columnas de entrada y salida en sus datos, es posible que desee excluir algunos datos (las filas impares de cada empleado son las filas que desea) agregando WHERE entered.OrderedPunch %2 = 1