Aller au contenu

RESOLU - Petite aide SQL


Profete162

Recommended Posts

Salut les geeks,

Je fais appel à vous pour un truc qui n'a rien à voir avec Android mais qui me chagrine un peu.

J'ai promis de filer un coup de main à notre service IT ou personne n'y connait rien en SQL, et cela semble simple quand sur papier, mais cela me laisse un peu perplexe. Voici donc le problème:

Nous avons pour les emplois du temps du personnel une base de donnée.

Cette DB comporte une table de la forme:

Nom de l'employé - Projet - Jour - Nombre d'heures

Ce qui fait que nous avons des choses comme:

Marcel à travaillé 3 heures le 1er janvier pour le Projet A

Marcel a aussi travaillé le premier janvier pendant 4 heures pour le projet B

Robert a travaillé 8 heures pour le Projet C le 1er janvier

Robert a travaillé 8 heures pour le Projet A le 2 janvier

etc...

Le truc, c'est que nous essayons de faire un calendrier mensuel avec un récapitulatif des heures. Le but serait de mettre en rouge les jours ou il a oublié ses heures.

La méthode brute serait de faire une requete du genre:

SELECT SUM(heures) FROM matable WHERE Employe=Marcel AND date=1/01/2010 

Je fais une boucle sur tous les jours du mois et c'est OK.

Malheureusement, cela fait 30 requêtes à ma DB en peu de temps et cela me semble un peu cochon.

Pensez vous qu'il y a moyen de faire mieux? Serait-ce possible en une requête?

Un grand merci pour toute aide.

Lien vers le commentaire
Partager sur d’autres sites

ton champ date c'est un champ date , timestamp ou varchar ?

D'ailleur on s'en fout un peu utilise la fonction group by comme ça tu devrait pouvoir sortir en une requete le nombre d'heure par mec et par jour.

9a devrait donner un truc comme çà (non testé)

SELECT  Employe ,date, SUM(heures) FROM matable group by Employe,date order by Employe,date

Edit après test dans Access ;) ça marche

SELECT test.employe, test.date, Sum(test.heure) AS SommeDeheure
FROM test
GROUP BY test.employe, test.date
ORDER BY test.employe, test.date;

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Bien que moritan ait apporté une réponse, j'apporte ma pierre.

Si j'ai bien compris on veut le nombre d'heures qu'un employé à passé au total sur un projet, et faire apparaître les jours où il n'a pas travaillé.

Donc voici la logique que j'aurais adopté (qui se rapproche un peu de celle de moritant) :

Dans la table EMPLOYE on récupère tous les employé et pour chacun :

- on va voir le ou les jours où il a travaillé

- on regarde le projet sur lequel il a travaillé

- et on fait le total du nombre d'heures passé à travailler

Ensuite on mettrais en évidence les jours où l'employé n'a pas travaillé

Correspondance avec les entrées de la table :

Table : EMPLOYE

Nom de l'employé : nomemp

Projet : codeprojet

Jour : jour

Nombre d'heures : nbheures

select nomemp, jour, codeprojet, sum(nbheures) Total_Heures
   from EMPLOYE
   group by nomemp, jour, codeprojet
   order by nomemp

intersect

select nomemp, jour, codeprojet, sum(nbheures) Total_Heures
   from EMPLOYE
   where nbheure is null;

Vu que je débute en SQL je me trompe peut être, mais j'espere que ça pourra aider au moins un peu

EDIT : oubli d'actuliser ^^''

en tout cas tant mieux que la solution de moritan aie été bonne

Lien vers le commentaire
Partager sur d’autres sites

J'avais pas compris ça comme ça pour moi on cherchait le nombre d'heure par jour travaillé quelque soit le projet.

Histoire de trouver les jours ou un employé à oublier de déclarer ses heures indépendamment du projet.

Après effectivement, on peut aussi faire des regroupements par projet.

Pour aller plus loin sic'est à des fin de reporting tu peux aussi ajouter un test sur le résultat de la somme d'heure par jour, comme ça tu ne ressort que les employés qui ont déclaré moins de X heure et tu exclu tout les employé dont le pointage est ok.

Lien vers le commentaire
Partager sur d’autres sites

En fait, c'est un mix que j'ai utilisé.

Moritan m'a ouvert les yeux sur le 'group by'

Je devais en effet faire un calendrier avec employé comme variable.

Il y a donc:

  • WHERE employee= $Employee (variable)
  • ORDER BY day ASC (pour faire un calendrier)

on se fout effectivement du projet, le but est de voir qu'il q rempli au moins 8 heures par jour et lui rappeller les jours qu'il a oublié

Lien vers le commentaire
Partager sur d’autres sites

(...) pour ne ressortir que les employés en dessous de 8 heures.

Le but est de renseigner à un employé X (Marcel) Qu'il a oublié de remplir ses heures le 4 janvier et le 17 mars, pas de spotter et traquer les gens qui ne bossent pas!

En remplacant "employé" dans ta phrase par "jour" cela fonctionne, c'est peut être un lapsus de ta part.

Limite on renseignera dans le calendrier les jours ou il y a moins de 8 heures en rouge, ceux ou il y a plus de 8 heures en vert et les jours = 8 heures on ne touche rien pour ne pas surcharger.

Lien vers le commentaire
Partager sur d’autres sites

ce que je voulais dire c'est qu'il est simple ne ne pas ressortir les résultats pour les cas ou le couple (employé - nb heure/jour) est égal à 8.

Comme ça tu n'as dans la liste que les cas problématiques ( ceux avec moins de 8H et ceux avec plus de 8H).

Après dans mon taff je concois principalement du reporting dons je réflaichi bizarrement quand je code :wacko:

Vu que généralement les bases sur lequelles je travaille sont énorme j'ai tendance à prendre le réflexe de faire des requêtes qui ont le maximum de contrainte et un minimum de résultat. (pour avoir de meilleur perf').

Et ensuite prévoir plusieurs rapport (un par besoin) plutôt que d'avoir un gros truc qui fait tout illisible.

Ta base est en Mysql de mémoire, si tu veux vraiment leur trouer le ***, tu peux utiliser un truc gratuit et opensource comme Talend ETL(c'est assez simple à prendre en main si on connait le JAVA et Eclipse)

Et en moins d'une journée tu as un programme capable de te sortir la liste des employés avec un pointage en erreur, de les prévenir par mail avec le détail des jours à remplir.

De prévenir le responsable de chaque projet avec un bilan de pointage dans un fichier Excel en pièce jointe.

Et le tout en automatique.

Bref tu passes pour un Dieu alors que tu as juste fait du clickou toute la journée dans une IHM, et encore une journée c'est si tu glandes ;)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...