*更新了请求*
我的记录显示少数员工有一些工作时间,大部分时间他们每天只有一条记录是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
正如您可以看到“预期结果表”,我需要根据上面的公式计算分解时间 提前感谢您帮助我解决这个问题。
答案 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)。