【问题标题】:SQL help in calculating regular and overtime hours for project billingSQL 帮助计算项目计费的正常和加班时间
【发布时间】:2015-07-21 11:30:59
【问题描述】:

我的桌子是这样的

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

我需要据此计算每个员工和每个工作项目的正常工作时间和加班时间。

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

我的结果应该是这样的

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 引擎支持窗口分区吗? (过分句)
  • 不,不是。我不必显示总部分。只是加班和正常时间的计算
  • 没有窗口功能的解决方案真的很可怕。它需要在什么 SQL 中工作?
  • 微软 sql 2008 服务器
  • 我们不能通过总计来做到这一点

标签: sql sql-server tsql


【解决方案1】:

对于 SQL 服务器,下面的代码可以工作。请注意,我使用 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

Sql 小提琴链接http://sqlfiddle.com/#!18/7eea7/2

【讨论】:

  • 您的回答很有帮助,但常规时间计算为 0
  • 你看过答案中的Sqlfiddle吗?对于周一至周四,常规时间栏下有一些时间。在 COALESCE 函数中封装为逻辑的内容是否还有更多要求。
  • 根据您的 SQL Fiddle,此查询不会产生最初请求的结果。事实上,将“Regular”列正确求和会产生 40,但将“OverTime”列求和会产生不正确的结果,即 63.78,而不是 33.78。
  • @STLDeveloper 感谢您的关注。我已经更新了小提琴和答案。在此处查看修订 [stackoverflow.com/posts/31541540/revisions]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2011-05-04
相关资源
最近更新 更多