Partage
  • Partager sur Facebook
  • Partager sur Twitter

Demande requête SQL

Obtenir la meilleure moyenne de chaque matière

Sujet résolu
    30 mars 2011 à 20:36:20

    Bonjour,

    Dans le cadre de mes études, je développe une application de gestion de saisie des notes d'élèves.
    Pour les besoins du logiciel, j'aimerais obtenir une requête qui affiche la meilleure moyenne de chaque matière pour la classe n°1 (en tenant compte des coefficients)

    Ex:

    Matière Moyenne
    Mathématiques 17.5
    Informatique 15
    Français 18


    Voici une partie du MLDR:

    CLASSE (codeClasse, libelleClasse)

    MATIERE (codeMatiere, libelleMatiere)

    DEVOIR (codeDevoir, libelleDevoir, dateDevoir, #codeMatiere, #codeClasse)
    Ex: 25, Interrogation trigger SQL, 30/03/2011, 3, 1
    Explication: Le devoir n°25 concerne la matière n°3 (Développement) de la classe n°1


    NOTES (#codeEleve, #codeDevoir, note)
    Ex: 1, 25, 13
    Explication: L'étudiant n°1 a eu 13 au devoir n°25


    ETUDIER(#codeClasse, #codeMatiere, coefficient)
    Ex: 1, 3, 4
    Explication: La matière n°3 a un coefficient de 4 pour la classe n°1


    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      30 mars 2011 à 22:09:08

      Ma version :
      SELECT libelleMatiere, MAX(moyenne) AS moyenneMax
      FROM matiere
        NATURAL JOIN (
          SELECT AVG(note * coefficient) AS moyenne, codeMatiere
          FROM devoir
            NATURAL JOIN notes
      	    NATURAL JOIN etudier
          WHERE codeClasse = 1
          GROUP BY libelleMatiere
        ) AS avgMatiere
      GROUP BY libelleMatiere
      
      • Partager sur Facebook
      • Partager sur Twitter
        30 mars 2011 à 22:30:39

        Merci pour cette réponse mais je ne comprend pas la requête: à quoi sert le NATURAL JOIN ?

        En tapant la requête sur SQL SERVER (et en corrigeant les fautes sur les noms de tables), celle-ci ne fonctionne pas, il me dit : "Syntaxe incorrecte vers le mot clé 'WHERE'."
        • Partager sur Facebook
        • Partager sur Twitter
          31 mars 2011 à 8:52:56

          Salut
          NATURAL JOIN est utilisé lorsque tu fais un jointure (ba oui y'a join :p) et que la primary key et la foreign key relié ont le même nom
          Si ce n'est pas le cas remplace le par un inner join + la clause ON
          • Partager sur Facebook
          • Partager sur Twitter
            31 mars 2011 à 17:16:45

            Merci pour vos explications.

            J'ai fini par trouver la requête qui répond à mon besoin :

            SELECT MAX(moyenneParMatiere ), M.libelleMatiere
            FROM(
                 SELECT M.libelleMatiere, SUM(note * coefficient) / SUM(coefficient) AS moyenneParMatiere 
                 FROM Etudier E, Notes N, Devoir D, Matiere M  
                 WHERE N.codeDevoir = D.codeDevoir 
                 AND D.codeMatiere = E.codeMatiere  
                 AND D.codeMatiere = M.codeMatiere 
                 AND D.codeClasse = 1 
                 GROUP BY M.libelleMatiere
                 )
            GROUP BY M.libelleMatiere
            
            • Partager sur Facebook
            • Partager sur Twitter
              31 mars 2011 à 17:59:06

              il doit manquer un identifiant dans ta requête.
              Ligne 3 tu crées une table anonyme que tu ne nommes pas ligne 10.
              A mon avis y'a un os par contre le principe de calcul est bon.

              Tracker.
              • Partager sur Facebook
              • Partager sur Twitter
                31 mars 2011 à 19:49:12

                Effectivement, voici la requête corrigée :

                SELECT MAX(moyenne), moyenneParMatiere.libelleMatiere
                FROM(
                     SELECT M.libelleMatiere, SUM(note * coefficient) / SUM(coefficient) AS moyenne
                     FROM Etudier E, Notes N, Devoir D, Matiere M  
                     WHERE N.codeDevoir = D.codeDevoir 
                     AND D.codeMatiere = E.codeMatiere  
                     AND D.codeMatiere = M.codeMatiere 
                     AND D.codeClasse = 1 
                     GROUP BY M.libelleMatiere
                     ) as moyenneParMatiere
                GROUP BY moyenneParMatiere.libelleMatiere
                
                • Partager sur Facebook
                • Partager sur Twitter

                Demande requête SQL

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown