clements42 a écrit :
Bonjour, Dans un cadre scolaire, je dois réaliser une appli qui calcule des moyennes de notes de classes. Je parviens à obtenir toutes les moyennes des élèves d'une classe par matière avec : Code :
- SELECT (SUM(valeur_note * coeff_devoir) / SUM(coeff_devoir)) As Moyenne , nom_matiere
- FROM NOTES N, DEVOIR D, COURS C
- WHERE C.nom_classe='blablabla'
- AND N.id_devoir = D.id_devoir (1)
- AND D.id_cours = C.id_cours (2)
- GROUP BY nom_matiere, login_eleve;
|
|
Salut,
Je suis un peu hors sujet, mais il y a un truc important que tu dois savoir : la méthode que tu utilises pour faire tes jointures est dépassée et source d'erreurs potentiellement graves. En effet, les jointures (1) et (2) sont réalisées par WHERE, ce qui peut s'avérer dangereux pour tout un tas de raisons. Cette méthode est dépassée, et sémantiquement incorrecte en plus d'être dangereuse (un WHERE sert à restreindre le jeu d'enregistrements, pas à l'étendre comme le fait la jointure). La meilleure façon de réaliser des jointures consiste à utiliser la syntaxe JOIN (INNER, LEFT ou RIGHT selon le type de jointure souhaité). Cette syntaxe est normalisée, et élimine toute suppression malencontreuse d'un WHERE. Ainsi, ta requête pourrait se réécrire comme ceci :
Code :
- SELECT (SUM(valeur_note * coeff_devoir) / SUM(coeff_devoir)) As Moyenne , nom_matiere
- FROM NOTES N INNER JOIN DEVOIR D ON N.id_devoir = D.id_devoir
- INNER JOIN COURS C ON D.id_cours = C.id_cours
- WHERE C.nom_classe='blablabla'
- GROUP BY nom_matiere, login_eleve
|
En plus d'être plus lisible en permettant de bien mettre en évidence la partie jointure de la partie filtre, cette requête est bien plus sécurisée.
Je t'invite à lire tous les risques encourus par les jointures WHERE à partir d'ici : http://forum.hardware.fr/hfr/Progr [...] m#t1945827
Ou encore ici : http://forum.hardware.fr/forum2.ph [...] 0#t1963259
C'était le quart d'heure intégriste
---------------
J'ai un string dans l'array (Paris Hilton)