SQL帮助计算项目计费的正常和加班时间

SQL帮助计算项目计费的正常和加班时间,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的桌子看起来像这样 First Name Last Name Date Day Hours Project Name Joe Smith 6/22/15 Mon 8 Project A Joe Smith 6/23/15 Tue 11.75 Project A Joe Smith 6/24/15 Wed 10.25 Project A Joe Smith

我的桌子看起来像这样

First Name  Last Name   Date    Day Hours   Project Name
Joe         Smith     6/22/15   Mon 8       Project A
Joe         Smith     6/23/15   Tue 11.75   Project A
Joe         Smith     6/24/15   Wed 10.25   Project A
Joe         Smith     6/25/15   Thu 14.25   Project B
Joe         Smith     6/26/15   Fri 11.5    Project B
Joe         Smith     6/27/15   Sat 9.5     Project B
Joe         Smith    6/28/15    Sun 8.53    Project B
Firstname   Lastname    Date    Day Regular OverTime    Project Name
Joe          Smith     6/22/15  Mon 8.00                 Project A
Joe          Smith     6/23/15  Tue 11.75                Project A
Joe          Smith     6/24/15  Wed 10.25                Project A
Joe          Smith     6/25/15  Thu 10.00   4.25         Project B
Joe          Smith     6/26/15  Fri 0.00    11.50        Project B
Joe          Smith     6/27/15  Sat 0.00    9.50         Project B
Joe          Smith     6/28/15  Sun 0.00    8.53         Project B
--------------------------------------------------------------------
    Total                           40.00   33.78   
我需要计算每个员工和每个项目的正常工作时间和加班时间

正常时间:一周内的所有工作日小时数小于或等于40小时 加班:每周工作时间超过40小时,任何周末工作时间

我的结果应该是这样的

First Name  Last Name   Date    Day Hours   Project Name
Joe         Smith     6/22/15   Mon 8       Project A
Joe         Smith     6/23/15   Tue 11.75   Project A
Joe         Smith     6/24/15   Wed 10.25   Project A
Joe         Smith     6/25/15   Thu 14.25   Project B
Joe         Smith     6/26/15   Fri 11.5    Project B
Joe         Smith     6/27/15   Sat 9.5     Project B
Joe         Smith    6/28/15    Sun 8.53    Project B
Firstname   Lastname    Date    Day Regular OverTime    Project Name
Joe          Smith     6/22/15  Mon 8.00                 Project A
Joe          Smith     6/23/15  Tue 11.75                Project A
Joe          Smith     6/24/15  Wed 10.25                Project A
Joe          Smith     6/25/15  Thu 10.00   4.25         Project B
Joe          Smith     6/26/15  Fri 0.00    11.50        Project B
Joe          Smith     6/27/15  Sat 0.00    9.50         Project B
Joe          Smith     6/28/15  Sun 0.00    8.53         Project B
--------------------------------------------------------------------
    Total                           40.00   33.78   

我无法达到这个结果

对于SQL server,下面的代码可以使用。请注意,我使用COALESCE关键字来封装加班和正常工作时间计算的业务逻辑。 对于这些计算,我需要使用内部查询计算一周内的累计小时数,还需要确定小时数超过40时的拐点

SELECT 
Q.FirstName, 
Q.LastName,
Q.[Date],
Q.Day,
COALESCE(
      CASE 
         WHEN Q.[Day] like 's%' THEN 0 ELSE NULL END,
       CASE 
         WHEN Q.Cumulative>40 AND Q.cumulative-Q.hours>40 
         THEN 0 ELSE NULL END,
       CASE 
          WHEN Q.Cumulative>40 AND Q.cumulative-Q.hours<40 
          THEN 40-Q.cumulative+ Q.hours ELSE Q.hours END
        ) AS Regular,
COALESCE(
      CASE 
         WHEN Q.[Day] like 's%' THEN Q.Hours ELSE NULL END,
       CASE 
         WHEN Q.Cumulative>40 AND Q.cumulative-Q.hours>40
         THEN Q.hours ELSE NULL END,
       CASE 
          WHEN Q.Cumulative>40 AND Q.cumulative-Q.hours<40 
          THEN Q.Cumulative-40 ELSE 0 END
        ) AS OverTime,
Q.[Project Name]
FROM
(SELECT 
B.FirstName,
B.LastName,
B.[Date],
B.Day,
B.hours,
B.[Project Name],
(SELECT SUM(A.hours) FROM  [dbo].[temp] A WHERE A.[Date]<=B.[Date]) cumulative
FROM [dbo].[temp] B )Q
选择
问:名字,
问:姓氏,
Q.[日期],
问:这一天,
结合(
案例
当Q.[Day]像's%'时,则0 ELSE NULL结束,
案例
当Q.Cumulative>40和Q.Cumulative-Q.hours>40时
然后0,否则为空结束,
案例
当Q.Cumulative>40和Q.Cumulative-Q.hours40和Q.Cumulative-Q.hours>40时
然后Q.小时,否则空结束,
案例

当Q.Cumulative>40且Q.Cumulative-Q.hours时,您的SQL引擎支持窗口分区?(Over子句)不,不需要。我不需要显示总计部分。只需加班和定时计算,没有窗口函数,解决方案真的很糟糕。它需要使用什么SQL?microsoft SQL 2008 Server我们不能通过运行总计来完成吗?您的回答很有帮助,但定时计算0您是否查看了数据库中的Sqlfiddle答案?对于Mon-Thur,Regular hours列下有一些小时。对于COALESCE函数中封装为逻辑的部分,是否还有其他要求。根据您的SQL Fiddle,此查询不会生成最初请求的结果。事实上,对“Regular”列求和会正确生成40,但对“超时”进行求和列生成的结果不正确,为63.78,而不是33.78。@感谢您提醒注意。我已更新了小提琴和答案。请参阅此处的修订[