sql >> Database teknologi >  >> RDS >> Sqlserver

Få alle punch ind og ud for hver medarbejder?

Du kan bruge en subselect eller CTE til at få dataene bestilt af medarbejder og bruge dem som hoveddatatabel. Noget lignende (tilpas det om nødvendigt) til dette:

;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

Forklaring:Den 'bestilte' CTE viser medarbejderens ind-/udgange sorteret efter dato. ROW_NUMBER nulstilles for hver medarbejder (jeg antager, at emp_reader_id indeholder medarbejder-id'et) på grund af PARTITION BY .

Når jeg har fået tælleren for hver medarbejder, tilslutter jeg hvert slag for hver medarbejder (første betingelse i venstre join) med det næste slag for den pågældende medarbejder (anden betingelse i venstre join). På den måde kan jeg vise indtastningskolonnen og udgangen (det næste slag).

Efter du har fået ind- og ud-kolonnerne i dine data, vil du måske udelukke nogle data (de ulige rækker for hver medarbejder er de rækker, du ønsker) ved at tilføje WHERE entered.OrderedPunch %2 = 1




  1. Sådan ændres standard nul-sorteringsadfærd fra PostgreSQL i Django ORM

  2. Får ikke det ønskede output efter at have udført en QoQ

  3. Sådan tømmes alle rækker fra alle tabeller i mysql (i sql)

  4. udføre øjeblikkelig ændringssekvens virker ikke