编辑:它正在获取所有员工时间,无论该员工时间的工资代码如何!如何只选择'01普通'、'02加类1.5'、'03加类2.0'?该 IF 语句不起作用?
请参阅此处的源数据照片:
这太奇怪了!!!!我正在尝试进行全职等效人数统计!我的 SQL 语句在一行中生成正确的结果,但在下一行中生成错误的结果!这两行代码都是由完全相同的代码生成的!!!!
这是我的查询...
SELECT Supervisor,
IFNULL(CASE WHEN DAYOFWEEK(workdate) = 3 THEN
IF(employeehours.paycode = '01 Ordinary' AND employeehours = 8,CASE WHEN
employeehours.paycode = '01 Ordinary' OR employeehours.paycode = '02 Overtime 1.5' OR
employeehours.paycode = '03 Overtime 2.0' THEN (SUM(employeehours)-0.4)/7.6 END,CASE WHEN
employeehours.paycode = '01 Ordinary' OR employeehours.paycode = '02 Overtime 1.5' OR
employeehours.paycode = '03 Overtime 2.0' THEN (SUM(employeehours)/7.6) END) END, 0)
`Tuesday`,
FROM payroll.employeedatanew_copy
JOIN payroll.employeehours ON employeedatanew_copy.`ID Number` =
employeehours.employeeid
WHERE employeehours.workdate BETWEEN '2013-12-02' AND '2013-12-07'
GROUP BY supervisor, id number
结果如下!!! (不包括除星期二以外的所有日期)
对于主管“Matt Taylor”,我们有 2 名员工。
The first has:
8.00 in '01 ordinary'
1.60 in '02 overtime 1.5'
0.00 in '03 overtime 2.0'
The second has:
8.00 in '01 ordinary'
1.17 in '02 overtime 1.5'
0.00 in '03 overtime 2.0'
如果您手动进行计算,则第一次会得到 1.21,第二次会得到 1.15...!!!为什么使用完全相同的编码方法第一个计算结果是错误的!?
最佳答案
有人有一个保龄球分数计算查询,他们做得比需要的更复杂。 我帮助他们后退了一步,并尝试通过首先建立一个支点来简化它 每个人的相应列...然后应用您的数学...您可能会更好 采用类似的方法...
尝试这个只是为了确认数据的阶段......
SELECT
PreSum1.EmployeeID,
PreSum1.WorkDay,
PreSum1.RegTime,
PreSum1.OT15,
PreSum1.OT20,
( PreSum1.RegTime + PreSum.OT15 + PreSum.OT20
- IF( PreSum1.RegTime = 8, .4, 0 )) / 7.6 as DayTotal
from
( select
EH.EmployeeID,
DAYOFWEEK(EH.workdate) as WorkDay,
SUM( IF( EH.paycode = '01 Ordinary', EH.EmployeeHours, 0 )) as RegTime,
SUM( IF( EH.paycode = '02 Overtime 1.5', EH.EmployeeHours, 0 )) as OT15,
SUM( IF( EH.paycode = '03 Overtime 2.0', EH.EmployeeHours, 0 )) as OT20
FROM
EmployeeHours EH
WHERE
EH.workdate BETWEEN '2013-12-02' AND '2013-12-07'
group by
EH.EmployeeID,
DAYOFWEEK(EH.workdate) ) PreSum1
上面的查询对相关日期范围内的每个人每天的工作时间进行计算...并且仅适用于您正在考虑的 reg/ot1.5/ot2.0 3 类。
然后您可以根据每个主管/员工 ID 将其包含在其中
SELECT
NewData.Supervisor,
SUM( IF( EmpDaily.WorkDay = 1, EmpDaily.DayTotal, 0 )) as Sunday,
SUM( IF( EmpDaily.WorkDay = 2, EmpDaily.DayTotal, 0 )) as Monday,
SUM( IF( EmpDaily.WorkDay = 3, EmpDaily.DayTotal, 0 )) as Tuesday,
SUM( IF( EmpDaily.WorkDay = 4, EmpDaily.DayTotal, 0 )) as Wednesday,
SUM( IF( EmpDaily.WorkDay = 5, EmpDaily.DayTotal, 0 )) as Thursday,
SUM( IF( EmpDaily.WorkDay = 6, EmpDaily.DayTotal, 0 )) as Friday,
SUM( IF( EmpDaily.WorkDay = 7, EmpDaily.DayTotal, 0 )) as Saturday
from
payroll.employeedatanew_copy NewData
JOIN ( entire query above ) as EmpDaily
ON NewData.ID_Number = EmpDaily.EmployeeID
group by
NewData.Supervisor
关于MYSQL 语句不能产生准确的结果(SUM、IF 语句和 CASE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20415888/