Problème avec la fonction avg en double jointure

Problème avec la fonction avg en double jointure - SQL/NoSQL - Programmation

Marsh Posté le 30-04-2007 à 13:58:16    

Bonjour;
Je suis sur Mysql server 5.0, j'utilise Mysql query browser.
J'ai selectionné les notes données aux étudiants par un prof.
Je souhaite maintenant afficher uniquement les notes inférieures à la note moyenne.
J'ai rajouté une dernière ligne pour n'afficher que les notes inférieures à la moyenne mais il y a une erreur de syntaxe dans cette dernière ligne.
Trouvez-vous la solutions? Merci.
Voici le code :
Code :

Code :
  1. SELECT e.nom_etudiant, nota.note, p.nom_prof, p.prenom_prof
  2. FROM etudiant e, notation nota, cours c, nomination nomi,prof p
  3. WHERE e.id_etudiant = nota.id_etudiant
  4. AND nota.id_cours = c.id_cours
  5. AND c.id_cours = nomi.id_cours
  6. AND nomi.id_prof = p.id_prof
  7. AND p.nom_prof = 'EVANS'
  8. AND p.prenom_prof = 'Bill'
  9. AND nota.note < SELECT avg (nota.note);

Reply

Marsh Posté le 30-04-2007 à 13:58:16   

Reply

Marsh Posté le 30-04-2007 à 14:17:15    

Le select imbriqué est incorrect, tu dois remettre le "from notation nota" et les jointures si elles sont nécéssaires.

Reply

Marsh Posté le 30-04-2007 à 15:00:04    

Salut;
j'ai déjà testé AND nota.note < (select avg (nota.note) from notation); dans ce cas je n'ai pas de message d'erreur mais pas de résultat non plus.

Reply

Marsh Posté le 30-04-2007 à 15:12:58    

N'oublie pas que  
 
select avg (nota.note) from notation  
 
te donne la moyenne de toutes les notes sans distinction du cours/professeur.
Et vérifie que t'as bien des étudiants avec une note inférieure à cette moyenne.

Reply

Marsh Posté le 30-04-2007 à 15:52:35    

LePhasme a écrit :

N'oublie pas que  
 
select avg (nota.note) from notation  
 
te donne la moyenne de toutes les notes sans distinction du cours/professeur.
Et vérifie que t'as bien des étudiants avec une note inférieure à cette moyenne.


 
Oui il y a des étudiants qui ont une note inférieure à la moyenne.
 
J'ai essayé cela :

Code :
  1. SELECT e.nom_etudiant, nota.note, p.nom_prof, p.prenom_prof
  2. FROM etudiant e, notation nota, cours c,
  3. nomination nomi,prof p
  4. WHERE e.id_etudiant = nota.id_etudiant
  5. AND nota.id_cours = c.id_cours
  6. AND c.id_cours = nomi.id_cours
  7. AND nomi.id_prof = p.id_prof
  8. AND p.nom_prof = 'EVANS'
  9. AND p.prenom_prof = 'Bill'
  10. AND
  11. (
  12.     nota.note < (select avg (nota.note) from notation nota, cours c,
  13.     nomination nomi,prof p where  nota.id_cours = c.id_cours
  14.     AND c.id_cours = nomi.id_cours
  15.     AND nomi.id_prof = p.id_prof
  16.     AND p.nom_prof = 'EVANS'
  17.     AND p.prenom_prof = 'Bill')
  18. );

Reply

Marsh Posté le 30-04-2007 à 16:07:43    

Vérifie ce que renvoit  

Code :
  1. SELECT avg (nota.note) FROM notation nota, cours c,
  2.    nomination nomi,prof p WHERE  nota.id_cours = c.id_cours
  3.    AND c.id_cours = nomi.id_cours
  4.    AND nomi.id_prof = p.id_prof
  5.    AND p.nom_prof = 'EVANS'
  6.    AND p.prenom_prof = 'Bill');

 

Reply

Marsh Posté le 30-04-2007 à 16:24:51    

LePhasme a écrit :

Vérifie ce que renvoit  

Code :
  1. SELECT avg (nota.note) FROM notation nota, cours c,
  2.    nomination nomi,prof p WHERE  nota.id_cours = c.id_cours
  3.    AND c.id_cours = nomi.id_cours
  4.    AND nomi.id_prof = p.id_prof
  5.    AND p.nom_prof = 'EVANS'
  6.    AND p.prenom_prof = 'Bill');



 
Salut, ton dernier code renvoie une error 1064, lorsqu'on enlève la dernière parenthèse et qu'on recomile on obtient la moyenne soit : 10.2804.
 
A noter que ta remarque précédente était pertinente.
J'ai refait le code :

Code :
  1. SELECT e.nom_etudiant, nota.note, p.nom_prof, p.prenom_prof
  2. FROM etudiant e, notation nota, cours c,
  3. nomination nomi, prof p
  4. WHERE e.id_etudiant = nota.id_etudiant
  5. AND nota.id_cours = c.id_cours
  6. AND c.id_cours = nomi.id_cours
  7. AND nomi.id_prof = p.id_prof
  8. AND p.nom_prof = 'EVANS'
  9. AND p.prenom_prof = 'Bill'
  10. AND
  11. (
  12.     nota.note <
  13.     (   
  14.         select avg (nota.note)
  15.         FROM notation nota, cours c,
  16.         nomination nomi, prof p
  17.         WHERE  nota.id_cours = c.id_cours
  18.         AND c.id_cours = nomi.id_cours
  19.         AND nomi.id_prof = p.id_prof
  20.         AND p.nom_prof = 'EVANS'
  21.         AND p.prenom_prof = 'Bill'
  22.     )
  23. );


Et là j'obtiens que des notes < 10,2.
Merci.

Reply

Marsh Posté le 02-05-2007 à 12:05:32    

teycir a écrit :


Et là j'obtiens que des notes < 10,2.
Merci.


je pense qu'il y a plus simple en ajoutant une simple jointure et en utilisant la clause HAVING.
 
A tester :

Code :
  1. SELECT e.nom_etudiant, nota.note, p.nom_prof, p.prenom_prof, avg(moy.note) moyenne
  2. FROM etudiant e, notation nota, cours c, nomination nomi, prof p, notation moy
  3. WHERE e.id_etudiant = nota.id_etudiant
  4. AND nota.id_cours = c.id_cours
  5. AND c.id_cours = nomi.id_cours
  6. AND nomi.id_prof = p.id_prof
  7. AND p.nom_prof = 'EVANS'
  8. AND p.prenom_prof = 'Bill'
  9. AND moy.id_cours = nota.id_cours
  10. GROUP BY e.nom_etudiant, nota.note, p.nom_prof, p.prenom_prof
  11. HAVING nota.note < avg(moy.note);

Reply

Sujets relatifs:

Leave a Replay

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