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。@感谢您提醒注意。我已更新了小提琴和答案。请参阅此处的修订[