IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[MySQL] Requête ordonnant les résultats par mois


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 4
    Points
    4
    Par défaut [MySQL] Requête ordonnant les résultats par mois
    Bonjour !

    J'ai réalisé une base de données (mysql) dans le but d'analyser les incidents, les blessures qui surviennent aux salariés d'une entreprise...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #la construction simplifiee de la table des incidents
    CREATE TABLE IncidentTravail (
      idIncidentTravail INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
      dateHeureIncident DATETIME NOT NULL,
      Salarie_idSalarie INTEGER UNSIGNED NOT NULL,
      PRIMARY KEY(idIncidentTravail),
      INDEX IncidentTravail_FKIndex1(Salarie_idSalarie)
    );
    Je ne vois pas du tout comment procéder pour obtenir le nombre d'incident par mois sur une période donnée... sous la forme suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    JANVIER 2006     | 6
    FEVRIER 2006     | 0
    MARS 2006        | 3
    etc.
    Je ne sais vraiment pas par quoi commencer pour construire cette requete...
    D'avance un grand merci à ceux qui me fourniront quelques pistes !
    EDIT--

    J'ai trouvé un peu plus loin ce sujet qui est proche http://www.developpez.net/forums/showthread.php?p=592021#post592021

    Il faudrait d'abord construire une table des mois apparemment...

    Doit-elle être sous cette forme ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #table mois
    CREATE TABLE Mois (
      idMois INT(2) UNSIGNED NOT NULL AUTO_INCREMENT,
      libelleMois INT(10) NOT NULL,
      PRIMARY KEY(idMois)
    );
    Mais comment procéder ensuite ?

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut

    nul besoin d'une autre table...

    tu as déjà le DATETIME, il suffit d'un COUNT avec un GROUP BY

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DATE_FORMAT(dateHeureIncident, '%M %Y') AS mois, COUNT(*)
    FROM IncidentTravail
    GROUP BY mois
    Je ne suis pas sûr que le GROUP BY mois fonctionne... dans ce cas, remplace le par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY DATE_FORMAT(dateHeureIncident, '%M %Y')

  3. #3
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Pas tout a fait d'accord avec SWOOG, car en effet, cela fonctionne tant que tu as au moins une donnée pour un mois, mais si pour un mois tu n'as pas de données, la requete ne te renverra rien.

    Pas si simple que cela ton probleme !!!
    Faire une table avec les mois ca peut le faire, mais ca ne regle pas ton probleme d'années...

    Je ne sais pas si le plus simple ne serait pas d'externaliser cela avec un logiciel de developpement...

    Bon courage

  4. #4
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Donc pour résumer :

    1) il me faut une table des mois (pour éviter le probleme des mois avec 0 incident)

    2) il faut gérer les années

    Il faudrait faire des requêtes imbriquées selon vous ?

    Comme par exemple une sous requete qui liste tous les incidents de telle date à telle date.

    Si vous avez des réponses... car je patauge allègrement

    Yanicka tu penses qu'il n'est pas possible d'afficher ça uniquement par une syntaxe SQL et qu'il faut recourir à une fonction directement dans la partie applicative ?

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Arf, c'est vrai que s'il n'y a pas d'incident pour un mois donné, il n'y aura rien... faire une seconde qui stocke tous les mois sur lesquels on veut un résultat... ça ne résoudrait pas beaucoup le problème, enfin, il faudrait faire une sous-requête...

    je sais pas si c'est le top... :'(

    mais effectivement, avec un traitement avec un langage externe, ça serait bien plus simple ^^

  6. #6
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Je serais bien preneur d'un exemple de la syntaxe SQL qui pourrait être jouable...

    La raison est que mon appli va comporter un bon paquet de stat et j'aurais préféré que les requetes de ces stats soient stockées en base de données... Ainsi si il y a un bug dans la stat pas la peine de recréer un exe de l'appli, une correction de la requete en base de données suffirait...

    J'utilise MySql 4.1 et il me semble qu'il donne la possibilité d'utiliser les requete imbriquées...

  7. #7
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    bah, en supposant que dans la table mois tu ais la liste de la forme MOIS ANNEE dans le champ mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT M.mois, COUNT(
    <div style="margin-left:40px">SELECT IT.idIncidentTravail FROM IncidentTravail AS IT
    WHERE DATE_FORMAT(dateHeureIncident, '%M %Y') = M.mois</div>)
    FROM mois M

  8. #8
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup de m'aider... Je teste dès que je saurais comment creer la table sous la forme MOIS ANNEE

  9. #9
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    bah, il te suffit de mettre tous les mois (en anglais !) avec un espace et l'année sur 4 chiffres

  10. #10
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Ah D'accord donc un bete VARCHAR ; Arg pas moyen de contourner la langue anglaise ? Est-il possible de faire afficher dans le résultat de la requete les noms des mois en français ?

  11. #11
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Il y a peut-être moyen avec la configuration de MySQL... je ne sais pas... désolé... fait des tests

  12. #12
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Je reviens

    Je pense que ca peut etre possible de regler ca par une requete SQL, mais celle ci risque d'etre assez compliquée pour un resultat aussi simple.
    Le probleme consiste a gerer les mois et/ou années pour lesquel(le)s il n'y a aucun enregistrement.

    Etant donné que les mois sont fixes et invariables (de 1 a 12, de 'Janvier' a 'Décembre'), tu peux construire une table mois

    MOIS (idMois int, tMois varchar(15))

    Ajoutes y la clé primaire (idMois) et la contrainte (idMois<13) pour etre plus carré par exemple.

    Tu y ajoutes tous les mois de l'année avec leur valeur alpha (1,'Janvier'),(2,'Fevrier'), ....

    Le probleme de tes années est que cette valeur est variable (ca peut etre 1920, 2003, 2045, ....

    Tu peux alors creer une requete type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
        2005, tMois, sum(if(isnull(idincidenttravail),0,1)) as NbAccident 
    FROM
        incidenttravail
    RIGHT JOIN  mois ON Idmois = MONTH(dateheureincident)
                     AND year(dateheureincident) = 2005
    GROUP BY tMois ORDER BY IdMois
     
    Pour avoir le nombre d'accidents du travail pour tous les mois de l'année 2005.
    Apres tu reutilises cette requete dans du code externe pour gerer differentes années ou bien une plage d'années.

    Voila, y'a surement des tas d'autres solutions, peut etre (surement meme) meilleures que la mienne, mais j'espere pouvoir t'aider avec mes moyens

    bon courage

  13. #13
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup à vous tous. C'est très sympa de prendre du temps pour répondre à ces questions de débutants.

    Je vais utiliser temporairement ta solution Yanika_bzh. Je m'apperçois réellement que si on devait faire quelque chose de propre je devrais modéliser dans mon mcd des tables et des relations qui me permettrait de gérer ça en générique. - avoir une notion de "borne" en quelque sorte.

    En effet aujourd'hui ce sont les mois mais cela pourrait être d'autres types de tranches/bornes. Je réfléchi à ça car j'aurais bientot besoin de faire des stats qui présentent les résultats par tranches bien spécifiques (par ex des stat sur les âges (15 - 20 ans / 21-39 ans / etc.)

    Bien sûr si quelqu'un a déjà réalisé ce genre de travaux, je suis preneur ; bien que je pense qu'il serait plus formateur d'y réfléchir et de m'y coller...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA Excel] Ordonner les tabulations dans un formulaire
    Par Viper7 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/06/2006, 13h41
  2. Mysql : choix des types pour les champs entre :
    Par Thierry8 dans le forum Administration
    Réponses: 3
    Dernier message: 14/06/2006, 08h22
  3. [VBA-E]Ordonner les textbox
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/04/2006, 14h23
  4. [PHP5][MYSQL]Préserver une connexion entre les classes
    Par nesbla dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 02/02/2006, 11h51
  5. [VBA-E] Ordonner les feuilles d'un classeur
    Par ptitsoleil87 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/12/2005, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo