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

标签 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...!!!为什么使用完全相同的编码方法第一个计算结果是错误的!?

最佳答案

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

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

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/

相关文章:

php - 无法连接到xampp服务器

php - 将错误存储在数据库中的错误函数

php - MySQL 双阶

sql - 为什么 Linq To Sql 数据绑定(bind)到 gridview 比传递 SQL 慢得多?

java - SPRING MVC数据库jdbc错误

ruby-on-rails - 如何自动更改数据库中的记录?

mysql - 数据库设计 : how to track history?

jquery - 将大表单保存到多个表、规范化和动态查询

php - 正确地将不同的工作分配给不同的用户

php - 组合多个唯一的 MySQL 表并按一列排序,#2