Problème de requête de calculs de moyennes

Problème de requête de calculs de moyennes - SQL/NoSQL - Programmation

Marsh Posté le 17-05-2010 à 16:20:46    

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 :
  1. SELECT  (SUM(valeur_note * coeff_devoir) / SUM(coeff_devoir)) As Moyenne , nom_matiere
  2. FROM NOTES N, DEVOIR D, COURS C
  3. WHERE C.nom_classe='blablabla'
  4. AND N.id_devoir = D.id_devoir
  5. AND D.id_cours = C.id_cours
  6. GROUP BY nom_matiere, login_eleve;


 
qui me renvoie un truc sous la forme :
 
12.65 | Français
13.70 | Français
6.76 | Français
13.16 | Maths
10.54 | Maths
8.65 | Maths
 
Chaque ligne correspondant donc à la moyenne d'un élève dans la dite matière.
 
Maintenant, je souhaite donc obtenir les moyennes minimales par matière (de l'élève le plus mauvais, donc). J'ai essayé en ajoutant un (MIN) devant (SUM(valeur_note * coeff_devoir) / SUM(coeff_devoir))  dans le sélect, malheureusement cela ne fonctionne pas. Access me balance qu'il est impossible d'avoir une fonction d'agrégat dans l'expression MIN((SUM(valeur_note * coeff_devoir) / SUM(coeff_devoir))
 
Voici mes tables > http://nsa15.casimages.com/img/201 [...] 143029.png
 
merci à ceux qui m'aideront !

Message cité 1 fois
Message édité par clements42 le 17-05-2010 à 16:21:49
Reply

Marsh Posté le 17-05-2010 à 16:20:46   

Reply

Marsh Posté le 17-05-2010 à 17:04:45    

Oui, il faudrait utiliser une sous-requête.
Essayez ceci :

Code :
  1. SELECT
  2.        MIN(Moyenne) 'Min_Moyenne',
  3.   FROM
  4.    (SELECT  (SUM(valeur_note * coeff_devoir) / SUM(coeff_devoir)) As Moyenne , nom_matiere
  5.       FROM NOTES N, DEVOIR D, COURS C
  6.      WHERE C.nom_classe='blablabla'
  7.        AND N.id_devoir = D.id_devoir
  8.        AND D.id_cours = C.id_cours
  9.      GROUP BY nom_matiere, login_eleve) temp;

Reply

Marsh Posté le 17-05-2010 à 17:09:05    

Enregistrer le résultat du SQL sous forme de Requêtes dans Access permet ensuite de les attaquer comme des tables, c'est le seul moyen simple d'utiliser des "sous-requêtes" dans Access.


---------------
Don't fuck me, I'm anonymous.
Reply

Marsh Posté le 17-05-2010 à 17:43:38    

dans ton SGBD, y'a pas la fonction AVG() pour calculer une moyenne :??:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-05-2010 à 20:18:36    

Merci à vous, ça marche avec la sous requête.
 

rufo a écrit :

dans ton SGBD, y'a pas la fonction AVG() pour calculer une moyenne :??:


J'ai des coefficients à appliquer aux moyennes ;)

Reply

Marsh Posté le 18-05-2010 à 09:48:30    

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 :
  1. SELECT  (SUM(valeur_note * coeff_devoir) / SUM(coeff_devoir)) As Moyenne , nom_matiere
  2. FROM NOTES N, DEVOIR D, COURS C
  3. WHERE C.nom_classe='blablabla'
  4. AND N.id_devoir = D.id_devoir (1)
  5. AND D.id_cours = C.id_cours (2)
  6. 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 :
  1. SELECT  (SUM(valeur_note * coeff_devoir) / SUM(coeff_devoir)) As Moyenne , nom_matiere
  2. FROM NOTES N INNER JOIN DEVOIR D ON N.id_devoir = D.id_devoir
  3.              INNER JOIN COURS C ON D.id_cours = C.id_cours
  4. WHERE C.nom_classe='blablabla'
  5. 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 :D

Message cité 1 fois
Message édité par Harkonnen le 18-05-2010 à 09:49:27

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 26-05-2010 à 12:24:47    

Harkonnen a écrit :


.../...
 
C'était le quart d'heure intégriste :D


 
Intégriste vaut mieux que deux code-moi-ça :o


---------------
Don't fuck me, I'm anonymous.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed