计算总加班MySQL

时间:2011-12-21 19:23:50

标签: mysql sql mysql-error-1111

我正在创建一个时钟系统和管理网站。我试图通过MySQL查询来拉取特定部门的加班时间。

timeclocks更新名为events的MySQL表,该表存储employee_id,他们正在处理的jobtime_intime_out。我可以生成一个表格,其中包含每个employee_id的工作小时数:

SELECT employee_id, 
       SEC_TO_TIME(SUM(TIMEDIFF(time_out,time_in))) AS hours 
  FROM events 
 GROUP BY employee_id;

这将返回employee_id s的表格及其工作的总小时数。要创建employee_id加班表,我使用:

SELECT employee_id,
       IF(HOUR(SEC_TO_TIME(SUM(TIMEDIFF(time_out,time_in))))>40,
          HOUR(SEC_TO_TIME(SUM(TIMEDIFF(time_out,time_in))))-40,
          0) AS overtime 
  FROM events 
  GROUP BY employee_id;

这将返回employee_id s的表格及其工作的加班时间。

当我想要找到所有员工的加班费时,我遇到的麻烦就开始了。我假设我可以只使用IF函数来查找SUM()内部的加班时间,但是当我运行以下语句时:

SELECT SUM(IF(HOUR(SEC_TO_TIME(SUM(TIMEDIFF(time_out,time_in))))>40,
              HOUR(SEC_TO_TIME(SUM(TIMEDIFF(time_out,time_in))))-40,
              0)) AS overtime 
 FROM events;

我收到此错误:

ERROR 1111 (HY000): Invalid use of group function

我已经为此寻找了一切,但却找不到SUM(IF(SUM()))函数。

注意:加班费必须单独计算,我不能只考虑total hours worked / number of employees - 40。如果一个工人一周工作30个小时,另一个工作50个工作,则有10个小时的加班时间,但平均说没有工作时间。

2 个答案:

答案 0 :(得分:2)

这个怎么样?

SELECT SUM(overtime)
  FROM
  (
    SELECT employee_id,
           IF(HOUR(SEC_TO_TIME(SUM(TIMEDIFF(time_out,time_in))))>40,
              HOUR(SEC_TO_TIME(SUM(TIMEDIFF(time_out,time_in))))-40,
              0) AS overtime 
      FROM events 
     GROUP BY employee_id
  )TOTAL

当您使用SQL实现复杂的业务逻辑时,嵌套查询具有一个关键优势:它们允许您测试逻辑的每个级别并以可靠的方式构建它。

答案 1 :(得分:1)

请将此添加到Ollie的上述答案中:

SELECT SUM(overtime)
  FROM
  (
    SELECT employee_id,
           IF(HOUR(SEC_TO_TIME(SUM(TIMEDIFF(time_out,time_in))))>40,
              HOUR(SEC_TO_TIME(SUM(TIMEDIFF(time_out,time_in))))-40,
              0) AS overtime 
      FROM events
     GROUP BY employee_id
  ) TOTAL_OVERTIME

您需要为派生表命名以使代码生效。