2013-12-06 2 views
0

РЕДАКТИРОВАТЬ: Он захватывает все рабочие часы независимо от кода оплаты для этого рабочего дня !! Как выбрать только '01 обычный ',' 02 overtime 1.5 ',' 03 overtime 2.0 '? Это заявление IF не работает?Операция MYSQL, не создающая точных результатов (SUM, IF и CASE)

Смотрите здесь фото источник данных:

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 

Вот результат !!!! (Exluding все дни, но вторник)

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 для второго ... !!! ПОЧЕМУ первый из них неправильно вычисляет тот же подход к кодированию !?

+0

если я должен был догадаться. – Lenny

+0

Не может быть так, как нет округления, что далеко ...? – atomapps

+0

На самом деле я беру это обратно. Это не имеет смысла. Я бы сказал, что нужно дважды проверить эти операторы IF, какие из (если они есть) операторов if применимы только к неправильному результату. Бьюсь об заклад, это простая опечатка и часть математики, которая, случается, не относится к одному из двух результатов. – Lenny

ответ

0

У кого-то был запрос на вычисление оценки боулинга, который они сделали более сложным, чем нужно. Я помог им, немного отступив назад и пытаясь упростить его, сначала построив стержень в соответствующие столбцы для каждого человека ... ТОГДА примените свою математику ... Возможно, вам лучше С аналогичным подходом. ..

TRY это только подтвердить этапы данных ...

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 

этого запрос выше делает на одного человека за день основы отработанной для диапазона дат в вопросе ... и только для 3-х классификаций reg/ot1.5/ot2.0, которые вы рассматриваете.

Затем вы можете обернуть, что до этого в на Вероятно ошибки округления в супервизора/работника 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 
Смежные вопросы