Как узнать количество часов, отработанных на каждого сотрудника, из этой таблицы? - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь выяснить, как считать часы, отработанные для каждого сотрудника в каждый день, но возвращенные цифры далеко.Часть, которая мне нужна, взята из одной таблицы, показанной на этом рисунке. Таблица

Показывает активность одного сотрудника за один день (есть еще много записей, я просто решил показать один день).Большинство сотрудников устраивают обед, и поэтому у них есть 2 входа и 2 выхода.

К нему присоединена еще одна таблица, но пока это не важно.

В столбце InOut показанобыли ли они врезаться или нет.In = 1 и Out = 0.

Я пробовал код ниже.Похоже, что дата не возвращает правильное число.

select sr_name, 
cast(punchintime as date) as workdate,
ROUND(sum(cast(datediff(minute,punchintime, punchouttime) as real)/60),2) as hoursworked
from
(
select sr_name,
punchintime = punchdatetime,
punchouttime = ISNULL((select top 1 pc2.punchdatetime 
from punchclock pc2 where pc2.punchdatetime > pc.punchdatetime and pc.servrepid = pc2.servrepid and pc2.inout = 0 order by pc2.punchdatetime), getdate())

from punchclock pc
join servicereps sr on pc.servrepid = sr.servrepid
where cast(pc.punchdatetime as date) >= '2019-01-01'
group by sr_name, punchdatetime, pc.ServRepID
) x

сгруппировать по sr_name, приведению (punchintime как дата), cast (punchouttime - punchintime как время)

Результаты должныэтот запрос будет составлять около 8 часов вместо 20-30 часов.

1 Ответ

1 голос
/ 27 июня 2019

Ваш запрос всегда выбирает время последнего дня в день.

Вы должны присоединить TABLE punchclock (AS punchin, где inout = 1) к себе (AS punchout на punchout.row_number = punchin.row_number + 1), добавив row_number в CTE, используя

row_number() over (partition by repID, year, month, day order by punchdatetime asc) 

Проверьте этот пост для более подробной информации о row_number ()

Тогда оставшиеся будут просто

SUM(datediff(punchin.punchdatetime, punchout.punchdatetime))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...