2011-12-21 5 views
0

Je crée un système de gestion du temps et un site Web de gestion. J'essaie de tirer le montant des heures supplémentaires pour un département particulier avec une requête MySQL.Calcul du temps supplémentaire total MySQL

Les minuteries sont mis à jour une table MySQL appelée événements, qui stocke les employee_id, le job ils travaillent, le time_in et le time_out. Je peux produire une table des heures travaillées de chaque employee_id avec:

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

Ceci renvoie une table de employee_id s et le total des heures ils ont travaillé. Pour créer une table des heures supplémentaires employee_id J'utilise:

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; 

Ce retourne une table de employee_id s et le montant des heures supplémentaires travaillées.

Les problèmes que je rencontre commencent quand je veux trouver un total des heures supplémentaires effectuées pour tous les employés. Je suppose que je serais en mesure de mettre juste la fonction IF pour trouver des heures supplémentaires à l'intérieur de SUM() mais quand je lance la déclaration suivante:

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; 

Je reçois cette erreur de retour:

ERROR 1111 (HY000): Invalid use of group function 

J'ai regardé tous plus pour cela, mais ont trouvé peu de fonctions SUM(IF(SUM())).

Note: Les heures supplémentaires doivent être calculées individuellement, je ne peux pas prendre total hours worked/number of employees - 40. Si un travailleur travaille 30 heures par semaine et qu'un autre travaille 50 heures, il y a 10 heures supplémentaires, mais la moyenne indique qu'il n'y en a pas.

Répondre

2

Que pensez-vous de cela?

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 

Lorsque vous utilisez SQL pour mettre en œuvre la logique métier complexe, les requêtes imbriquées ont un avantage clé: ils vous permettent de tester chaque niveau de la logique et la construire de manière fiable.

+0

Merci beaucoup, j'avais besoin d'ajouter un alias pour la table intérieure pour éviter ERROR 1248 mais après cela, cela a fonctionné magnifiquement –

+0

doh! dégâts cérébraux oracle. Désolé pour l'alias manquant. –

1

ajouter ceci à la réponse ci-dessus par 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 

Vous devez nommer votre table dérivée pour le code de travail.