Profete162 Posté(e) 14 février 2011 Share Posté(e) 14 février 2011 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 More sharing options...
moritan Posté(e) 14 février 2011 Share Posté(e) 14 février 2011 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 More sharing options...
Profete162 Posté(e) 14 février 2011 Auteur Share Posté(e) 14 février 2011 Moritan, tu es tout simplement génial! Un grand merci pour tout! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spadewalk Posté(e) 14 février 2011 Share Posté(e) 14 février 2011 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 More sharing options...
moritan Posté(e) 14 février 2011 Share Posté(e) 14 février 2011 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 More sharing options...
Profete162 Posté(e) 14 février 2011 Auteur Share Posté(e) 14 février 2011 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 More sharing options...
moritan Posté(e) 14 février 2011 Share Posté(e) 14 février 2011 d'ou l'intérert d'e rajouter une clause where sur la sum des heures pour ne ressortir que les employés en dessous de 8 heures. PS. et les 35H bordel :D Lien vers le commentaire Partager sur d’autres sites More sharing options...
Profete162 Posté(e) 14 février 2011 Auteur Share Posté(e) 14 février 2011 (...) 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 More sharing options...
moritan Posté(e) 15 février 2011 Share Posté(e) 15 février 2011 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 More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.