时间:2016-03-16 14:04:25

标签: sql sql-server sql-server-2012

我正在尝试根据一些设定标准创建超时计算。它如下。

在超过8小时的任何一天发布加班但是员工必须首先达到40小时,并且计算从本周的第1天开始计算。加班时间是根据工作成本代码总数SUM的百分比计算得出的。

首先,您必须找到每个员工ID整周工作的每个成本代码的百分比。见下面的例子

然后每天超过8小时,你花时间在那天的代码上,然后乘以计算的百分比。在本周末,正常时间必须达到40小时,如果他们一周超过40小时。见下面的例子

CREATE TABLE [Totals](
    [Day] nvarchar (10) null,
    [EmployeeID] [nvarchar](100) NULL,
    [CostCode] [nvarchar](100) NULL,
    [TotalTime] [real] NULL,)

INSERT  Into Totals (day,employeeid, CostCode, TotalTime) VALUES
('1','1234','1', 2),
('1','1234','2', 7.5),
('2','1234','1', 1.5),
('2','1234','2', 8),
('3','1234','1', 1),
('3','1234','2', 6),
('4','1234','1', 2),
('4','1234','2', 8),
('5','1234','1', 2),
('5','1234','2', 8),
('1','4567','1', 2),
('1','4567','2', 8.5),
('2','4567','1', 1.5), 
('2','4567','2', 7.6),
('3','4567','1', 1),
('3','4567','2', 5),
('4','4567','1', 2),
('4','4567','2', 8),
('5','4567','1', 2),
('5','4567','2', 8)

要获得每项成本的百分比,它是每周每周成本的SUM总时间/整周的总时间

   SELECT employeeid,CostCode,SUM(totaltime) As TotalTime ,
   ROUND(SUM(Totaltime) / (select SUM(TotalTime) from Totals where employeeid = '1234') * 100,0) as Percentage
    from Totals WHERE EmployeeID = '1234' group by EmployeeID, CostCode

每周按成本计算的百分比= 18%用于成本1,82%用于成本2

我想获取本周的百分比结果并计算查询中每天的总时间

结果示例第1天:对于EmployeeID 1234

Day CostCode RegTime OverTime 
 1     1        1.73     .27      
 1     2        6.27    1.23

2 个答案:

答案 0 :(得分:2)

编辑后我得到你的结果,试试这个:

if i == j:

这是计算这个的最简单方法:

SELECT IssueDate,DueDate, max(DATEDIFF(DueDate,CURDATE())*5, 0) AS fine FROM issue

但要在第3天观看,因为只有7小时。 第一个查询分别计算天数和第3天。 第二个查询缩放所有小时。 它可能是另一个,它计算所有的emp行,但是分别按比例缩放RegTime和OverTime,在没有8h的日期除外,并从OverTime将它增加到8h。

答案 1 :(得分:1)

这可以帮助你开始......

select t.*
from (select t.*,
             (cast(parsename(iplow, 4)*1000000000.0 as decimal(12, 0)) +
              cast(parsename(iplow, 3)*1000000.0 as decimal(12, 0)) +
              cast(parsename(iplow, 2)*1000.0 as decimal(12, 0)) +
              cast(parsename(iplow, 1) as decimal(12, 0))
             ) as iplow_decimal,
             (cast(parsename(iphigh, 4)*1000000000.0 as decimal(12, 0)) +
              cast(parsename(iphigh, 3)*1000000.0 as decimal(12, 0)) +
              cast(parsename(iphigh, 2)*1000.0 as decimal(12, 0)) +
              cast(parsename(iphigh, 1) as decimal(12, 0))
             ) as iphigh_decimal
      from t
     ) t
where 192168002050 between iplow_decimal and iphigh_decimal;