【发布时间】:2021-01-11 21:04:09
【问题描述】:
我的工作每天针对两张表运行一次,一张包含员工当前的假期和 PTO 余额 (dbo.Balance),另一张包含新的缺勤 (dbo.Absence)。所有值都以分钟为单位。
我正在尝试使用逻辑来确定每次缺勤(前一天)应该将多少时间应用于假期、pto 或无薪。它应该按以下顺序申请:1)假期,2)PTO,3)未付。我对下面的代码很好,直到一名员工在同一天两次单独缺勤。我已经为此苦苦挣扎了一个星期,无法弄清楚如何让它在运行时基本上为每个存储桶保持运行平衡。
实际的工作更复杂,涉及根据此输出修改每条记录的开始和结束时间 - 所以我确实需要为每条缺勤记录单独一行。
dbo.Balance
| EmpId | HolidayBal | PTOBal |
|:------|:----------:|-------:|
| 1 | 60 | 120 |
| 2 | 240 | 600 |
| 3 | 0 | 0 |
dbo.Absence
| EmpId | Time Taken |
|:------|-----------:|
| 1 | 210 |
| 1 | 45 |
| 2 | 120 |
| 3 | 120 |
我希望结果是什么样的:
| EmpId | TimeTaken | HolidayUsed | PTOUsed | Unpaid |
|:------|:----------:|:-----------:|:-------:|:------:|
| 1 | 210 | 60 | 120 | 30 |
| 1 | 45 | 0 | 0 | 45 |
| 2 | 120 | 120 | 0 | 0 |
| 3 | 120 | 0 | 0 | 120 |
这是我到目前为止的代码,只是当一天缺勤超过 1 次时无法正确应用。
SELECT
BAL.EmpId
,BAL.HolidayBalance
,BAL.PTOBalance
,AB.TimeTaken
,CASE --HOLIDAY CALCULATION
WHEN BAL.HolidayBalance - AB.TimeTaken >= 0 THEN -- HOLIDAY BALANCE EXCEEDS TIME USED, ALL TIME USED AS HOLIDAY
AB.TimeTaken
WHEN BAL.HolidayBalance > 0 AND BAL.HolidayBalance - AB.TimeTaken < 0 THEN -- TIME USED EXCEEDS HOLIDAY BALANCE, ALL HOLIDAY BALANCE USED
BAL.HolidayBalance
ELSE
0
END AS HolidayUsed
,CASE -- PTO CALCULATION
WHEN BAL.HolidayBalance - AB.TimeTaken >= 0 THEN -- ALL TIME USED AS HOLIDAY
0
WHEN BAL.HolidayBalance > 0 AND BAL.HolidayBalance - AB.TimeTaken < 0 THEN -- HOLIDAY BALANCE WAS LESS THAN TIME USED, HAVE A REMAINDER
CASE
WHEN ((BAL.PTOBalance) - (AB.TimeTaken - BAL.HolidayBalance)) >= 0 THEN -- HAVE ENOUGH PTO BALANCE TO COVER REMAINDER
((BAL.PTOBalance) - (AB.TimeTaken - BAL.HolidayBalance))
WHEN BAL.PTOBalance > 0 AND ((BAL.PTOBalance) - (AB.TimeTaken - BAL.HolidayBalance)) < 0 THEN -- HAVE A PTO BALANCE BUT DOES NOT COVER REMAINDER
BAL.PTOBalance
ELSE
0
END
WHEN BAL.PTOBalance > 0 AND BAL.HolidayBalance = 0 AND BAL.PTOBalance - AB.TimeTaken >=0 THEN -- HAVE PTO TO COVER IT AND NO HOLIDAY BALLANCE.
AB.TimeTaken
WHEN BAL.PTOBalance > 0 AND BAL.HolidayBalance = 0 AND AB.TimeTaken > BAL.PTOBalance THEN-- HAVE NO HOLIDAY AND PTO BALANCE DOES NOT COVER EVERYTHING
BAL.PTOBalance
ELSE 0
END AS PTOUsed
,CASE -- UNPAID CALCULATION
WHEN BAL.PTOBalance + BAL.HolidayBalance - AB.TimeTaken < 0 THEN --NOT ENOUGH PTO OR HOLIDAY TO COVER ABSENCE
AB.TimeTaken - (BAL.PTOBalance + BAL.HolidayBalance)
ELSE
0
END AS Unpaid
FROM dbo.Balance BAL
INNER JOIN dbo.Absence AB ON BAL.EmpId = AB.EmpId
【问题讨论】:
标签: sql sql-server