0

私はタイムレコーダーシステムと管理ウェブサイトを作成しています。MySQLクエリを使用して、特定の部門の残業の量を取得しようとしています。

タイムレコーダーは、イベントと呼ばれるMySQLテーブルを更新します。このテーブルには、、作業中の、employee_idおよびが格納されます。それぞれからの合計労働時間の表を作成できます。jobtime_intime_outemployee_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時間の残業がありますが、平均では何もありません。

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 に答える