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

Requêtes MySQL Discussion :

AVG par GROUP BY ne fonctionne pas


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut AVG par GROUP BY ne fonctionne pas
    Bonjour,

    J'essaie de développer une petite application de gestion des notes et je ne parviens pas à trouver la syntaxe SQL qui me donnerait le résultat que je cherche.

    En l'occurrence je désire obtenir une moyenne par élève et par discipline et le résultat de ma requête me renvoie toujours une moyenne générale basée sur l'ensemble des notes bien que le group by ait fonctionné puisque j'ai un enregistrement par discipline.

    Alors du coup je ne sais pas si le problème vient de ma requête ou de mon MCD car comme vous l'avez sans doute deviné je suis novice.

    Ma requête ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ele.id, ele.prenom, ele.nom, comp.discipline, AVG( res.resultat ) 
    FROM resultats AS res, competences AS comp, exercices AS exe, eleves AS ele
    WHERE res.id_eleve = ele.id
    AND res.id_exercice = exe.id
    AND ele.id =1
    GROUP BY comp.discipline
    ORDER BY discipline ASC
    et le résultat :

    +----+-----------+-------+----------------------------+---------------------+
    | id | prenom | nom | discipline | AVG( res.resultat ) |
    +----+-----------+-------+----------------------------+---------------------+
    | 1 | Stephanie | Blanc | calcul | 9.8640 |
    | 1 | Stephanie | Blanc | écriture | 9.8640 |
    | 1 | Stephanie | Blanc | géométrie / mesure | 9.8640 |
    | 1 | Stephanie | Blanc | grammaire / conjugaison | 9.8640 |
    | 1 | Stephanie | Blanc | lecture / compréhension | 9.8640 |
    | 1 | Stephanie | Blanc | numération | 9.8640 |
    | 1 | Stephanie | Blanc | orthographe | 9.8640 |
    | 1 | Stephanie | Blanc | récitation | 9.8640 |
    | 1 | Stephanie | Blanc | rédaction | 9.8640 |
    | 1 | Stephanie | Blanc | résollution de problèmes | 9.8640 |
    | 1 | Stephanie | Blanc | vocabulaire | 9.8640 |
    +----+-----------+-------+----------------------------+---------------------+

    J'ai cherché sur le net et partout je tombe sur un exemple tout simple avec un AVG(X) GROUP BY Y ...

    Bref je suis preneur de tous les conseils, liens, suggestions ...

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    je désire obtenir une moyenne par élève et par discipline
    Votre group by ne comporte que la colonne compétence, de ce fait l'agrégation ne sera portée que sur cette colonne.

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Voici justement un lien pour lire un peu sur le sujet : http://cedric-duprez.developpez.com/...fier-group-by/
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci de vos réponses mais j'avoue ne pas comprendre cette remarque :

    Citation Envoyé par punkoff Voir le message
    bonjour,
    Votre group by ne comporte que la colonne compétence, de ce fait l'agrégation ne sera portée que sur cette colonne.
    Je ne désire pas grouper mes données selon un autre critère, pourquoi alors devrais-je ajouter un critère d'agrégation ? Et quel critère ajouter, selon quelle logique ?

    Le 'AND ele.id = 1' restreint les résultats à ceux de mon premier élève, et ensuite je désire afficher les moyennes de cet élève pour chaque discipline, je pensais donc que l'ajout d'un 'GROUP BY comp.discipline' discipline suffisait.
    J'ai d'ailleurs vu plusieurs exemples ou un AVG et un GROUP BY donnait bien une moyenne par catégorie avec un GROUP BY unique.

    Quantau lien suggéré, j'ai lu la page en question mais j'avoue que le novice que je suis a encore du mal avec les explications qui s'y trouvent.

    Merci.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Dans ce cas vous recherchez la moyenne des notes par compétence pour un élève donné.


    Bref, il vous manque une jointure a minima entre votre table de compétences et le reste.

    Utilisez les jointures normées pour éviter ce genre de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select *
    from ma_table A
    inner join ma_table2 B on A.id = b.id
    ....

  6. #6
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut
    Bonjour
    Au delà de la remarque sur la jointure, je pense que ce résultat peut s'expliquer par le fait que toutes les colonnes du SELECT qui ne sont pas agrégées (qui ne font pas l'objet d'une transformation par un fonction type avg() ) doivent figurer dans le GROUP BY , ce qui n'est pas le cas ici. Reportez vous au 2e point du nota dans le lien...
    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ele.id, ele.prenom, ele.nom, comp.discipline, AVG( res.resultat ) 
    FROM resultats res 
    INNER JOIN competences comp ON [?cf post précédent?]
    INNER JOIN exercices exe ON res.id_exercice = exe.id
    INNER JOIN eleves ele ON res.id_eleve = ele.id AND ele.id =1
    GROUP BY ele.id, ele.prenom, ele.nom, comp.discipline
    ORDER BY discipline ASC

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Non, c'est bien l'absence d'une clause de jointure qui engendre ce résultat : il y a un produit cartésien entre les disciplines et les notes.

    Du coup, pour chaque discipline, une moyenne est calculée sur la totalités de notes... et fatalement, elle vaut toujours la même chose...

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Encore merci pour vos réponses.

    Je ne vois toujours pas ce qui cloche ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ele.id, ele.prenom, ele.nom, comp.discipline, AVG( res.resultat ) 
    FROM resultats res
    INNER JOIN exercices exe ON res.id_exercice = exe.id
    INNER JOIN competences comp ON comp.id = exe.id_competence
    INNER JOIN eleves ele ON res.id_eleve = ele.id
    AND ele.id =1
    GROUP BY ele.id, ele.prenom, ele.nom, comp.discipline
    me donne :

    +----+-----------+-------+--------------------------+---------------------+
    | id | prenom | nom | discipline | AVG( res.resultat ) |
    +----+-----------+-------+--------------------------+---------------------+
    | 1 | Stephanie | Blanc | lecture / compréhension | 9.8640 |
    +----+-----------+-------+--------------------------+---------------------+

    J'ai pourtant ajouté comme suggéré une jointure sur les compétences INNER JOIN competences comp ON comp.id = exe.id_competence et le GROUP BY se fait désormais sur l'ensemble des champs qui n'appartiennent pas à la transformation par AVG.

    J'en viens à me demander si ce n'est pas mon MCD qui est en cause.

    Comment être certain que le problème vient de ma requête et pas de choix erronés dans la construction des tables ?

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    La requête est bonne, par contre votre élève n'a de données renseignées que pour 1 seule compétence.

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par punkoff Voir le message
    La requête est bonne, par contre votre élève n'a de données renseignées que pour 1 seule compétence.
    Effectivement l'erreur ne venait pas de la requête mais de mon jeu de données fictif créé par un script php comportant une erreur...

    Je viens de corriger et désormais la requête que vous m'aviez indiquée fonctionne parfaitement.

    Un grand merci pour vos réponses et votre patience !

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/09/2009, 15h08
  2. Réponses: 0
    Dernier message: 10/06/2009, 10h36
  3. Liens par e-mail ne fonctionnent pas
    Par 2nis dans le forum SharePoint
    Réponses: 9
    Dernier message: 02/06/2008, 13h54
  4. Group by ne fonctionne pas
    Par webfranc dans le forum SQL
    Réponses: 10
    Dernier message: 07/05/2008, 14h30
  5. Réponses: 4
    Dernier message: 28/12/2006, 18h42

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