2011-12-21 117 views
0

我正在創建一個時鐘系統和管理網站。我正在試圖通過MySQL查詢爲特定部門提取加班的數量。計算總加班MySQL

的timeclocks更新MySQL表稱爲事件,它存儲了employee_id,他們正在對job,該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_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個表和他們工作的加班量。

當我想要找到一份爲所有員工工作的加班時間時,我遇到了麻煩。我認爲我將能夠只是把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

這個怎麼樣?

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來實現複雜的業務邏輯,嵌套查詢有一個關鍵的優勢:他們讓你測試邏輯的各個層次,以可靠的方式建立起來。

+0

非常感謝你,我需要爲內部表添加一個別名,以避免ERROR 1248,但是這樣做後它的效果很好 – 2011-12-21 20:10:55

+0

doh!甲骨文腦損傷。遺憾的是失蹤的別名。 – 2011-12-21 22:43:45

1

只是由奧利添加此上述答案:

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 

您需要命名派生表的代碼工作。