MYSQL语句不能产生准确的结果(SUM,IF语句和CASE)

时间:2013-12-06 04:18:53

标签: mysql sql database

编辑:无论员工的薪水代码是什么,它都会抓住所有员工职位!我如何只选择'01普通','02加班1.5','03加班2.0'? IF声明无效?

在此处查看源数据照片:

enter image description here

这很奇怪!!!!我正在努力做一个相当于头数的全职!我的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

这是结果!!!! (不包括所有日子,但周二)

enter image description here

对于主管'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 ......为什么第一个用完全相同的编码方法计算错误!

1 个答案:

答案 0 :(得分:0)

有人有一个保龄球得分计算查询,他们做的比他们需要的更复杂。 我通过先退一步,试图通过建立一个支点来简化它来帮助他们 每个人基础的相应列...然后应用你的数学......你可能会更好 用类似的方法......

尝试这只是为了确认数据的各个阶段......

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
相关问题