0

我正在创建一个时钟系统和管理网站。我正在尝试使用 MySQL 查询来提取特定部门的加班时间。

时钟更新一个名为 events 的 MySQL 表,该表存储employee_idjob他们正在处理的、time_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_ids 表和他们工作的总小时数。要创建一个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_ids 表和他们工作的加班时间。

当我想找到所有员工的加班总数时,我遇到的麻烦就开始了。我以为我可以将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 小时的加班时间,但平均来说没有。

4

2 回答 2

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 实现复杂的业务逻辑时,嵌套查询有一个关键优势:它们可以让您测试逻辑的每个级别并以可靠的方式构建它。

于 2011-12-21T19:37:18.507 回答
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

您需要命名派生表才能使代码正常工作。

于 2011-12-21T19:46:03.943 回答