如何在数据库上有效地执行高级处理?

时间:2009-09-15 17:57:25

标签: .net asp.net sql-server sql-server-2005

我正在开发一个使用SQL Server作为后端的时间表应用程序,我正在尝试找出在数据库中实现相对复杂的处理逻辑以实现报告的最佳方法。

我有一个表(timesheet_entries),它由以下字段组成:

  • entry_id

  • EMPLOYEE_ID

  • JOB_ID

  • job_state

  • pto_code(这表示该条目是付费时间关闭,并且是什么类型的PTO的假设 - 假期,生病等 - 它是。当填充job_id时它总是为NULL,反之亦然)

  • ENTRY_DATE

  • total_hours

  • ot_exempt(一个布尔值,用于确定是否应在加班总计中计算该条目)

我需要创建一个报告,该报告可以为每个按州分类的员工提供时间摘要。我知道通过使用SUM(total_hours)和GROUP BY job_state可以相当容易地做到这一点,但是我需要计算加时的方式对它有一个相当具体的逻辑。

首先,我需要计算给定时间段内每位员工的总小时数。接下来我需要减去标记为PTO或OT豁免的任何时间以获得我的正常工作时间。从那里我可以开始计算一周内超过40小时的任何正常时间加班。对我来说真正困难的是,我必须能够通过收集状态来计算OT,主要是跟踪哪个条目(按entry_date排序)将用户的常规时间推到40以上,然后确保我开始累计OT对于特定工作所在的州(job_state)。

例如,如果一个人在北卡罗来纳州的一个工作中工作了他一周的前35个小时,然后在SC工作的下一个15个工作,那么报告必须显示如下内容:

员工姓名/工作状态/注册时间/加班时间

Smith,John / NC / 35/0

Smith,John / SC / 5/10

如果你说他在SC工作15个小时后,他开始在北卡罗来纳州的另一个工作,他将不得不开始在北卡罗来纳州的OT,因为他已经超过40个正常时间一周。如果John Smith在NC工作了15个小时,那么他的最终报告将如下:

员工姓名/工作状态/注册时间/加班时间

Smith,John / NC / 35/15

Smith,John / SC / 5/10

我很确定这是使用常规SQL无法实现的。我是否必须使用UDF或类似的东西才能完成此任务?考虑到我可以使用简单的查询轻松获取员工的条目,我是否可以将结果集转储到UDF中以处理然后输出我想要的结果?如果没有,我是否只需要在UDF中包含并执行SQL语句?

如果有人对我可能完成这项任务的最佳方式有任何想法,我将非常感激。

-Mike

4 个答案:

答案 0 :(得分:2)

业务逻辑属于业务层。我认为这可能有点太多了,不能放在SQL中(即使有可能)。

答案 1 :(得分:1)

您可以在一个用户存储过程(sp)中使用多个查询来执行此操作。您可以将多个结果集返回到ASP.Net代码,以供ASP.Net中的DataTables使用DataSet使用。然后,您可以使用它来创建报告。

答案 2 :(得分:0)

这可能最好在代码中处理。您需要关注的是服务总线,而不是花哨的T-SQL。

答案 3 :(得分:0)

不要忘记CLR Stored Procedures。您可以编写加载到SQL Server 2005+数据库中的.NET DLL作为存储过程执行。您正在描述的逻辑可能比使用.NET语言(例如C#)更容易实现,而不是TSQL。