Как эффективно выполнить расширенную обработку моей БД? - PullRequest
0 голосов
/ 15 сентября 2009

Я разрабатываю приложение для создания расписаний, используя 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

Ответы [ 4 ]

2 голосов
/ 15 сентября 2009

Бизнес-логика принадлежит бизнес-уровню. Я думаю, что это, вероятно, слишком много, чтобы поместить в SQL (даже если это возможно).

1 голос
/ 15 сентября 2009

Вы можете сделать это с несколькими запросами внутри одной пользовательской хранимой процедуры (sp). Вы можете вернуть несколько результирующих наборов в свой код ASP.Net для использования DataSet с DataTables в ASP.Net. Затем вы можете использовать это для создания вашего отчета.

0 голосов
/ 15 сентября 2009

Не забудьте CLR хранимых процедур . Вы можете написать .NET DLL, которые загружаются в вашу базу данных SQL Server 2005+ для выполнения в качестве хранимых процедур. Логика, которую вы описываете, вероятно, легче реализовать на языке .NET (например, C #), чем на TSQL.

0 голосов
/ 15 сентября 2009

Это, вероятно, лучше всего обрабатывать в коде. То, что вам нужно посмотреть, это служебные шины, а не причудливый T-SQL.

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