Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtenez tous les punch in et out pour chaque employé ?

Vous pouvez utiliser une sous-sélection ou CTE pour obtenir les données classées par employé et les utiliser comme table de données principale. Quelque chose de similaire (adaptez-le si nécessaire) à ceci :

;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

Explication :Le CTE "ordonné" affiche les entrées/sorties d'employés classées par date. Le ROW_NUMBER est réinitialisé pour chaque employé (je suppose que emp_reader_id contient l'identifiant de l'employé) en raison de la PARTITION BY .

Une fois que j'ai obtenu le compteur pour chaque employé, je joins chaque poinçon pour chaque employé (première condition dans la jointure de gauche) avec le poinçon suivant pour cet employé (deuxième condition dans la jointure de gauche). De cette façon, je peux afficher la colonne d'entrée et la sortie (le poinçon suivant).

Après avoir obtenu les colonnes d'entrée et de sortie dans vos données, vous voudrez peut-être exclure certaines données (les lignes impaires de chaque employé sont les lignes que vous voudriez) en ajoutant WHERE entered.OrderedPunch %2 = 1