Я разрабатываю приложение для создания расписаний, используя SQL Server в качестве бэкэнда, и пытаюсь найти лучший способ справиться с реализацией относительно сложной логики обработки в моей БД для целей отчетности.
У меня есть таблица (timesheet_entries), которая состоит из следующих полей:
entry_id
employee_id
job_id
job_state
pto_code (это означает, что запись имеет оплаченное время отключения и является идентификатором типа PTO - отпуск, больной и т. Д.). Это всегда NULL при заполнении job_id и наоборот)
entry_date
total_hours
ot_exempt (логическое значение, определяющее, должна ли запись рассчитываться в итоговых суммах сверхурочных)
Мне нужно создать отчет, который может дать сводку времени для каждого сотрудника в разбивке по штатам. Я знаю, что могу сделать это довольно легко, используя SUM (total_hours) и GROUP BY job_state, однако у меня, как мне нужно для расчета сверхурочных, есть довольно специфическая логика.
Перво-наперво. Сначала мне нужно рассчитать общее количество часов для каждого сотрудника за определенный период времени. Затем мне нужно вычесть любое время, помеченное как PTO или OT Exempt, чтобы получить мои общие часы работы. Оттуда я могу начать отсчет любых обычных часов, которые в неделю превышают 40 часов. Что делает это действительно трудным для меня, так это то, что я должен быть в состоянии вычислить OT по состоянию, в котором он был собран, по существу отслеживая, какая запись (упорядоченная по entry_date) подталкивает обычные часы пользователя за 40, а затем убедитесь, что я начинаю суммировать OT для состояния, в котором находится конкретная работа (job_state).
Например, если он работает первые 35 часов в неделю на работе в NC, а затем тратит следующие 15 на работу в SC, в отчете должно быть указано что-то вроде следующего:
Имя сотрудника / Штат / Рег. Часы / OT Часы
Смит, Джон / NC / 35/0
Смит, Джон / SC / 5/10
И если вы скажете, что после того, как он проработал 15 часов на работе в SC, он начал работать на другой работе в NC, ему следовало бы начать начислять OT в NC, так как он уже был бы более 40 обычных часов в неделя. Если Джон Смит завершит неделю, проработав 15 часов в Северной Каролине, его окончательный отчет будет выглядеть так:
Имя сотрудника / Штат / Рег. Часы / OT Часы
Смит, Джон / NC / 35/15
Смит, Джон / SC / 5/10
Я почти уверен, что это невозможно сделать с помощью обычного SQL. Должен ли я использовать UDF или что-то подобное для выполнения этой задачи? Учитывая, что я могу довольно легко получить записи сотрудника с помощью простого запроса, могу ли я вывести результирующий набор в UDF для обработки и затем вывести желаемый результат? Если нет, то должен ли я просто включить и выполнить инструкцию SQL в UDF?
Если у кого-то есть мысли о том, как лучше всего выполнить эту задачу, я был бы очень признателен.
-Mike