2011-12-21 31 views
0

タイムクロックシステムと管理Webサイトを作成しています。私は、MySQLのクエリを使用して、特定の部門の超過時間を引き出そうとしています。合計超過時間の計算MySQL

timeclocksはemployee_id、彼らが作業しているjobtime_intime_outを格納するイベントと呼ばれるMySQLのテーブルを、更新します。これは、employee_id S、彼らが働いた総時間のテーブルを返します

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

:私は、各employee_idから働いた総時間のテーブルを生成することができます。 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秒のテーブルと、彼らが働いている時間外労働の量を返します。

私が抱えている問題は、すべての従業員が働いている残業の合計を探したいときに始まります。

ERROR 1111 (HY000): Invalid use of group function 

私はすべてを見ている:私は戻って、このエラーを取得する

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; 

:私は、私はちょうど私が次のステートメントを実行しますがSUM()の内部残業を見つけるためにIF機能を置くことができるだろうと想定しましたこれ以上はSUM(IF(SUM()))の機能がほとんど見つかっていません。

注:超過時間は個別に計算する必要があります。私はちょうどtotal hours worked/number of employees - 40とします。 1人の労働者が1週間に30時間働いて、別の労働者が50時間働くと、10時間の残業がありますが、平均には何もないと言われています。

答えて

2

これはいかがですか?あなたは、複雑なビジネスロジックを実装するためにSQLを使用している場合は

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 

、ネストされたクエリは、重要な利点を持っている:彼らはあなたがロジックの各レベルをテストし、信頼性の高い方法でそれを構築しましょう。

+0

ありがとう、エラー1248を避けるために内部テーブルのエイリアスを追加する必要があったが、それを行った後、それは美しく動作した –

+0

doh!オラクルの脳の損傷。行方不明のエイリアスについては申し訳ありません。 –

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 

あなたは、コードが機能するために、あなたの派生テーブルに名前を付ける必要があります。