sql >> Databáze >  >> RDS >> Sqlserver

Dostat všechny údery dovnitř a ven pro každého zaměstnance?

Můžete použít podvýběr nebo CTE k získání dat seřazených podle zaměstnance a použít je jako hlavní datovou tabulku. Něco podobného (v případě potřeby si to upravte):

;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

Vysvětlení:'Objednaný' CTE zobrazuje vstupy/výstupy zaměstnanců seřazené podle data. ROW_NUMBER je resetováno pro každého zaměstnance (předpokládám, že emp_reader_id obsahuje id zaměstnance) kvůli PARTITION BY .

Jakmile mám počítadlo pro každého zaměstnance, spojím každý úder pro každého zaměstnance (první podmínka v levém spojení) s dalším úderem pro tohoto zaměstnance (druhá podmínka v levém spojení). Tímto způsobem mohu zobrazit vstupní sloupec a výstup (další úder).

Poté, co ve svých datech získáte vstupní a výstupní sloupce, možná budete chtít některá data vyloučit (liché řádky každého zaměstnance jsou řádky, které byste chtěli) přidáním WHERE entered.OrderedPunch %2 = 1




  1. LEFT OUTER JOIN s podmínkami (kde, objednat)?

  2. Identifikace a oprava problému s výkonem předávaných záznamů

  3. Jak vygenerovat diagram entit-relationship (ER) pomocí Oracle SQL Developer

  4. Oracle Pipelined funkce