Расчет общего сверхурочного времени MySQL - PullRequest
0 голосов
/ 21 декабря 2011

Я создаю веб-сайт системы управления временем.Я пытаюсь получить количество сверхурочных для конкретного отдела с запросом MySQL.

Временные часы обновляют таблицу MySQL с именем events, в которой хранятся 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 с и общее количество отработанных часов.Для создания таблицы сверхурочных employee_id s я использую:

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 часов, но в среднем говорят, что его нет.

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Как насчет этого?

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 голос
/ 21 декабря 2011

Просто добавьте это к приведенному выше ответу Олли:

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

Вам нужно назвать свою производную таблицу, чтобы код работал.

...