Общее количество сотрудников, вошедших в систему - PullRequest
1 голос
/ 24 октября 2019

Я хочу рассчитать общее количество сотрудников, вошедших в систему в определенное время, а также общее рабочее время каждого из них.

У нас есть система входа в систему, которая хранит данные в следующей структуре данных:

1.EmpId
2.Status
3.Created

Приведенные выше данные хранятся в следующей таблице:

EmpId   Status  Created
1   In  2019-10-23 12:00:00
1   Out 2019-10-23 12:45:45
2   In  2019-10-23 14:25:40
1   In  2019-10-23 18:45:45
2   Out 2019-10-23 20:50:40
2   In  2019-10-24 1:27:24
3   In  2019-10-24 2:45:45

За In следует Out и наоборот. И продолжительность работы сотрудников распределена по дням, я имею в виду, что вход и выход могут быть по дням.

Мне нужно реализовать следующее:

Как рассчитать количество сотрудников, вошедших в системув определенное время произнесите: «2019-10-23 14:12:45».

Как рассчитать общее рабочее время всех сотрудников с начала работы?

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Предполагая, что входы и выходы чередуются, вы можете использовать условное агрегирование и фильтрацию:

select sum(case when status = 'in' then 1
                when status = 'out' then -1
           end) as employees_at_time
from t
where create <= '2019-10-23 14:12:45';
0 голосов
/ 24 октября 2019

Вы можете использовать этот запрос для регистрации сотрудников в определенное время:

SELECT * 
FROM (
  SELECT EmpID, Created AS [In], LEAD(Created) OVER (PARTITION BY EmpID ORDER BY Created ASC) AS [Out]
  FROM table_name
  WHERE Status = 'In'
) t WHERE '2019-10-23 14:12:45' BETWEEN [In] AND [Out]
  OR '2019-10-23 14:12:45' >= [In] AND [Out] IS NULL;

... и следующий запрос, чтобы получить общее количество рабочих часов каждого сотрудника как TIMEзначение :

SELECT EmpID, CONVERT(TIME(0), DATEADD(S, ISNULL(SUM(DATEDIFF(S, [In], [Out])), 0), 0), 108) AS work_hours 
FROM (
  SELECT EmpID, Created AS [In], LEAD(Created) OVER (PARTITION BY EmpID ORDER BY Created ASC) AS [Out]
  FROM table_name
  WHERE Status = 'In'
) t GROUP BY EmpID

демо на dbfiddle.uk

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

WITH Employees(EmpID, [In], [Out]) AS
(
  SELECT EmpID, Created AS [In], LEAD(Created) OVER (PARTITION BY EmpID ORDER BY Created ASC) AS [Out]
  FROM table_name
  WHERE Status = 'In'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...