Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Вземете всичко за всеки служител?

Можете да използвате подизбор или CTE, за да получите данните, подредени по служител и да ги използвате като основна таблица с данни. Нещо подобно (адаптирайте го, ако е необходимо) на това:

;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

Обяснение:„Поръчаният“ CTE показва влизането/излизането на служителите, подредени по дата. ROW_NUMBER се нулира за всеки служител (предполагам, че emp_reader_id съдържа идентификатора на служителя) поради PARTITION BY .

След като получа брояча за всеки служител, свързвам всеки удар за всеки служител (първо условие в лявото съединение) със следващия удар за този служител (второ условие в лявото съединение). По този начин мога да покажа колоната за влизане и изхода (следващия удар).

След като получите входните и изходящите колони във вашите данни, може да искате да изключите някои данни (нечетните редове на всеки служител са редовете, които бихте искали), като добавите WHERE entered.OrderedPunch %2 = 1




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CONTAINSTABLE заместващ знак е неуспешен при съвпадение по фраза?

  2. Преобразуване на Unicode в Non-Unicode

  3. Как да конвертирате разделен със запетая списък в редове в SQL Server

  4. Създаване на пощенски профил на база данни (SSMS)

  5. Как да генерирате динамични етикети и да използвате името и стойността на колоната като текст