在同一天为同一个人分配多个记录的时间(循环)

时间:2017-09-08 15:17:31

标签: sql sql-server

*更新了请求*

我的记录显示少数员工有一些工作时间,大部分时间他们每天只有一条记录是REG,有时他们每天会有多于一天,例如REG和OT或REG,OT,和OT1。我的任务的第一部分是花时间并将小时与另一张桌子(包括休息时间)相匹配,并取相应的休息时间,然后从实际小时数中扣除休息时间并显示结果。我已经成功完成了这项工作。 任务的第二部分是如果每天有超过1条记录,如REG,OT或REG,OT,OT1那么我必须总计小时数(reg,ot,ot1)然后去休息找到相应的中断,然后将小时数(中断/ 60)与当天的每条记录相乘,然后将其除以总和,取此值并从实际金额中减去 。以下是示例(我猜我需要某种循环)

小时数据表

EMP_ID    DATE         HOUR TYPE   HOUR
--------  ----------   ----------  ----------
1234      8/1/17       REG         8
2345      8/1/17       REG         5
3456      8/1/17       REG         8
3456      8/1/17       OT          1
4567      8/1/17       REG         8
4567      8/1/17       OT          1
4567      8/1/17       OT1         2

中断数据表

HOUR_TYPE    FROM_HR_1   TO_HR_1    BREAK_IN_MIN_1  FROM_HR_2   TO_HR_2    BREAK_IN_MIN_2    FROM_HR_2   TO_HR_2    BREAK_IN_MIN_2
-----------  ----------  ---------  --------------- ----------  ---------  ---------------   ----------  ---------  ---------------
REG          0           5          20              6            8         40                9            12         60
OT           0           5          0               6            8         40                9            12         60
OT1          0           5          0               6            8         0                 9            12         40

当前结果表

EMP_ID    DATE         HOUR TYPE   ACT_HOUR   ADJ_HOUR 
--------  ----------   ----------  ---------  ---------
1234      8/1/17       REG         8          7.34
2345      8/1/17       REG         5          4.67
3456      8/1/17       REG         8          7.34
3456      8/1/17       OT          1          1
4567      8/1/17       REG         8          7.34
4567      8/1/17       OT          1          1
4567      8/1/17       OT1         2          2

预期结果表

EMP_ID    DATE         HOUR TYPE   ACT_HOUR   ADJ_HOUR 
--------  ----------   ----------  ---------  ---------
1234      8/1/17       REG         8          7.34
2345      8/1/17       REG         5          4.67
3456      8/1/17       REG         8          7.12
3456      8/1/17       OT          1          .89
4567      8/1/17       REG         8          7.28
4567      8/1/17       OT          1          .91
4567      8/1/17       OT1         2          1.82

正如您可以看到“预期结果表”,我需要根据上面的公式计算分解时间 提前感谢您帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

因为您无法在更新查询中使用聚合函数,所以您需要使用派生表(子查询也可以使用)。我的回答假设您有一个hours表和一个breaks表,并且每个员工/日期都有一行中断。

尝试以下几点:

update 
    hours
set
    ADJ_HOUR = 
    round(
        ADJ_HOUR -
            -- Build the value to subtract from ADJ_HOUR:
            (
                (b.BREAK_IN_MIN_1 + b.BREAK_IN_MIN_2) -- Sum of the breaks
                / (convert(float, cnt.total_rows) -- Divide the minutes by the num of "hours" rows
            )
            / convert(float, 60) -- Divide the subtract amount by 60 (minutes)
    , 1) -- Round to 1 decimal place
from 
    hours h
    join breaks b 
        on (h.employee=b.employee and h.date=b.date) -- Get the breaks for each employee
     -- Get the num of hour rows:
    join (select employee, date, count(*) as total_rows from hours group by employee_date) as cnt 
        on (h.employee=cnt.employee and h.date=cnt.date)

关于所有convert(float...)调用的注意事项:当你希望浮点值来自除以两个整数的除法时,你需要将其中一个值转换/转换为浮点数。否则,优化器将数据类型设置为与两个除数值相同(两个int数据类型生成一个int)。