我正在创建一个时钟系统和管理网站。我试图通过MySQL查询来拉取特定部门的加班时间。
timeclocks更新名为events的MySQL表,该表存储employee_id
,他们正在处理的job
,time_in
和time_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个小时的加班时间,但平均说没有工作时间。
答案 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
您需要为派生表命名以使代码生效。