Разбивка данных временной карты на минуты и свод. SQL Server

#sql-server

#sql-сервер

Вопрос:

У меня есть некоторые данные временной карты, которые я пытаюсь рассчитать, сколько минут работает каждый час, и сводить данные.

Изображение, вероятно, проще, чем пытаться объяснить.

Рисунок

Выделенный является примером 7/1/20. Левая таблица — это то, что я вижу в таблице SQL Server, которая называется TimeCard. Правильная таблица — это то, чего я пытаюсь достичь.

Комментарии:

1. Образцы данных в виде текста, предпочтительно инструкций DDL и DML, воспринимаются гораздо лучше, чем изображения.

2. Пример вывода не соответствует данным SQL. Бывший сотрудник № 100006 7/1 отработал 12 часов 19 минут… Ваш вывод показывает 15 часов 41 минуту… Кроме того, оплачивается ли обед и перерывы?

3. J-m, ты пробовал запрос?

Ответ №1:

Вы также можете использовать использование CASE вместо PIVOT и operator cross apply с table master.dbo.spt_values, чтобы получить список часов между Punch_In_time и Punch_out_time.Затем получаем минуты для каждого времени.

В запросе, пожалуйста, замените псевдонимы на имя ваших столбцов и название таблицы.

 select EmployeeId,
max(CASE WHEN number=4 then min else 0 end) AS '4 AM',
max(CASE WHEN number=5 then min else 0 end) AS '5 AM',
max(CASE WHEN number=6 then min else 0 end) AS '6 AM',
max(CASE WHEN number=7 then min else 0 end) AS '7 AM',
max(CASE WHEN number=8 then min else 0 end) AS '8 AM',
max(CASE WHEN number=9 then min else 0 end) AS '9 AM',
max(CASE WHEN number=10 then min else 0 end) AS '10 AM',
max(CASE WHEN number=11 then min else 0 end) AS '11 AM',
max(CASE WHEN number=12 then min else 0 end) AS '12 AM',
max(CASE WHEN number=13 then min else 0 end) AS '1 PM',
max(CASE WHEN number=14 then min else 0 end) AS '2 PM',
max(CASE WHEN number=15 then min else 0 end) AS '3 PM',
max(CASE WHEN number=16 then min else 0 end) AS '4 PM',
max(CASE WHEN number=17 then min else 0 end) AS '5 PM',
max(CASE WHEN number=18 then min else 0 end) AS '6 PM',
max(CASE WHEN number=19 then min else 0 end) AS '7 PM',
max(CASE WHEN number=20 then min else 0 end) AS '8 PM',
max(CASE WHEN number=21 then min else 0 end) AS '9 PM',
max(CASE WHEN number=22 then min else 0 end) AS '10 PM',
max(CASE WHEN number=23 then min else 0 end) AS '11 PM'
    from
   (
   select X.*,P.number,
    case when datepart(hh,Punch_In_time)=number then 
    IIF(datepart(minute,Punch_In_time)=0,60,datepart(minute,Punch_In_time))
      when datepart(hh,Punch_Out_time)=number then 
    IIF(datepart(minute,Punch_Out_time)=0,60,datepart(minute,Punch_Out_time))
      else 60
    end min
    from 
     (select * from Table where Punch_in_date='7/1/2020')X
    cross apply
    master.dbo.spt_values P
    where P.type='P' And P.number>=datepart(hh,Punch_In_time) and  P.number<=datepart(hh,Punch_Out_time)
   )Y
    group by EmployeeId
  

Комментарии:

1. Я выполнил запрос. Для меня это выглядит хорошей отправной точкой. Мне нужно будет кое-что изменить и добавить больше часов и, возможно, включить больше дней в запрос.