#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. Я выполнил запрос. Для меня это выглядит хорошей отправной точкой. Мне нужно будет кое-что изменить и добавить больше часов и, возможно, включить больше дней в запрос.