Problème requête ACCESS

Problème requête ACCESS - SQL/NoSQL - Programmation

Marsh Posté le 09-12-2009 à 20:50:32    

bonsoir,
 
dans un cadre scolaire, je dois développer une appli permettant, entre autre, de calculer des moyennes à partir de notes
 
http://nsa11.casimages.com/img/2009/12/09/mini_091209084527523125.png
 
je souhaite faire 2 choses :  
 
calculer les moyennes par élève, dans chaque matière
calculer les moyennes de chaque classe, dans chaque matière
 
concernant la première, j'y arrive avec la requête suivante:
 

Code :
  1. SELECT (SUM(valeur_note * coeff_note) / SUM(coeff_note)) As Moyenne, nom_matiere
  2. FROM NOTES N, DEVOIR D, COURS C
  3. WHERE N.login_eleve = un_user
  4. AND N.id_devoir = D.id_devoir
  5. AND D.id_cours = C.id_cours
  6. group by nom_matiere;


Pour la seconde en revanche, impossible d'y parvenir. Pourtant, ça me parait tout bête, puisque j'arrive à calculer les moyennes individuelles. Je pensais juste faire la somme de celles-ci, divisées par le nombre d'élève dans la classe, par exemple (il y a peut être d'autres solutions).
 
Merci d'avance à ceux qui tenteront de m'aider...

Reply

Marsh Posté le 09-12-2009 à 20:50:32   

Reply

Marsh Posté le 09-12-2009 à 22:19:48    

1) dans le modèle que tu fournis, l'entité Matière ne sert à rien. dans un cours, on enseigne une matière et une seule, pas 36. c'est donc une relation (1,1) pour laquelle une clé étrangère est inutile

 

2) choisir ce qui est manifestement un type alphanumérique comme clé primaire c'est vraiment pas génial, ça devrait même être interdit (tables matière et classe)

 

3) les jointures, on les fait par INNER JOIN, pas par WHERE. si c'est ton prof qui t'a dit de faire comme ça, alors signale le au rectorat et balance le au bucher.

 

4) ta requête est pas mal, mais si tu veux calculer la moyenne par élève, alors tu devras la lancer autant de fois que tu as d'élèves ce qui là encore n'est pas top.
tu dois la modifier pour que ton recordset ressemble à ceci :

 


Eleve       Matière      Moyenne
xxx          xxx           xxx

 

un exemple pour les élèves TOTO, TUTU et TATA pour les matières HISTOIRE et MATHS :

 


Eleve       Matière      Moyenne
TOTO      HISTOIRE    12
TOTO      MATHS        5
TATA      HISTOIRE     4
TATA      MATHS        15
TUTU      HISTOIRE     3
TUTU      MATHS        14.5


si tu arrives à faire ressembler ta 1ere requête à ça, alors la seconde te tombera sous le sens.

 

bon courage


Message édité par Harkonnen le 09-12-2009 à 22:51:06

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

Marsh Posté le 10-12-2009 à 14:37:50    

Salut,
 
Merci pour ta réponse.
 
Je parviens à obtenir le résultat que tu indiques pour la 1è requête, grâce à celle-ci :
 

Code :
  1. SELECT login_eleve, nom_matiere, (SUM(valeur_note * coeff_note) / SUM(coeff_note)) As Moyenne
  2. FROM NOTES N, DEVOIR D, COURS C
  3. WHERE  C.nom_classe = 'nom_d_une_classe'
  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 :


Eleve   Matière      Moyenne
 
TOTO   Maths          12
TOTO   Français       10.54
TOTO   Economie       1.8
TATA   Maths          14.2
TATA   Maths          10.7
TATA   Economie       11.1


 
En revanche, la 2è requête ne me saute pas aux yeux pour reprendre ton expression  :whistle:  
 
J'avais pensé à un truc comme ça
 

Code :
  1. SELECT nom_classe, nom_matiere, (SUM(valeur_note * coeff_note) / SUM(coeff_note)) As Moyenne
  2. FROM NOTES N, DEVOIR D, COURS C
  3. WHERE  C.nom_classe = 'nom_d_une_classe'
  4. AND N.id_devoir = D.id_devoir
  5. AND D.id_cours = C.id_cours
  6. GROUP BY nom_classe, nom_matiere;


 
Ça me renvoie des résultats presque cohérents, sauf si un élève a moins de notes qu'un autre, je m'explique.
 
en maths, toto a eu 17 au DS1 (coeff 2) et 11 au DS2 (coeff 1)
en maths, tata a eu 10 au DS1 (coeff 2 donc), mais aucune au DS2
 
toto a une moyenne de 45/3 = 15
tata a une moyenne de 20/2 = 10
 
la moyenne de classe doit donc être de (10+15)/2= 12.5
 
Or, avec la requête ci dessus, ça ne différencie pas les élèves: Ca va faire (17*2 + 11*1 + 10*2) / (2+1+2) = 13
 
Ça ne fait donc pas "une moyenne des moyennes", mais une moyenne de toute les notes.
 
En espérant m'être fait comprendre...
 
Merci


Message édité par clements42 le 10-12-2009 à 14:39:28
Reply

Sujets relatifs:

Leave a Replay

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