[resolu] faire un max d'une somme : j'y arrive pas !

faire un max d'une somme : j'y arrive pas ! [resolu] - SQL/NoSQL - Programmation

Marsh Posté le 26-04-2011 à 21:03:41    

Bonsoir
 
Quand je lance cette requête "mysql" , tout va bien, je récupère bien une liste.
 
SELECT ( sum( re.note_numerique * e.coefficient ) / sum( e.coefficient ) )
FROM resultat_epreuve re
JOIN epreuve e ON ( e.id_epreuve = re.id_epreuve )
JOIN matiere m ON ( e.id_matiere = m.id_matiere )
JOIN classe c ON ( c.id_classe = e.id_classe )
WHERE c.id_classe =41
AND e.date_epreuve >= "2010-01-01"
AND e.date_epreuve <= "2015-01-01"
GROUP BY m.id_matiere, m.libelle_long_matiere
LIMIT 0 , 30
 
Je voudrai maintenant récupérer le max de cette liste.J'ai donc tout naturellement ajouté le mot clé MAX comme suit :
 
SELECT max( sum( re.note_numerique * e.coefficient ) / sum( e.coefficient ) )
FROM resultat_epreuve re
JOIN epreuve e ON ( e.id_epreuve = re.id_epreuve )
JOIN matiere m ON ( e.id_matiere = m.id_matiere )
JOIN classe c ON ( c.id_classe = e.id_classe )
WHERE c.id_classe =41
AND e.date_epreuve >= "2010-01-01"
AND e.date_epreuve <= "2015-01-01"
GROUP BY m.id_matiere, m.libelle_long_matiere
LIMIT 0 , 30
 
 
Et là je me prends une erreur vilaine : #1111 - Invalid use of group function
 
La doc dit qu'on ne peut pas faire de aggrégat d'aggrégat. Dés lors comment faire ?  
 
Nb  :suis pas l'expert en sql, vos suggestions seront les bienvenues.
 
 
DOminique


Message édité par domi_bu le 27-04-2011 à 08:47:42

---------------
Domi
Reply

Marsh Posté le 26-04-2011 à 21:03:41   

Reply

Marsh Posté le 26-04-2011 à 21:08:57    

En mettant les SUM() dans une sous-requête ?

Code :
  1. select MAX(la_somme) from (
  2.   SELECT ( sum( re.note_numerique * e.coefficient ) / sum( e.coefficient ) ) la_somme
  3.   FROM resultat_epreuve re
  4.   JOIN epreuve e ON ( e.id_epreuve = re.id_epreuve )
  5.   JOIN matiere m ON ( e.id_matiere = m.id_matiere )
  6.   JOIN classe c ON ( c.id_classe = e.id_classe )
  7.   WHERE c.id_classe =41
  8.   AND e.date_epreuve >= "2010-01-01"
  9.   AND e.date_epreuve <= "2015-01-01"
  10.   GROUP BY m.id_matiere, m.libelle_long_matiere
  11.   LIMIT 0 , 30
  12. ) tb_a


 
(j'ai un doute sur le LIMIT dans la sous-requête [:figti] )


Message édité par mrbebert le 26-04-2011 à 21:09:36

---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 26-04-2011 à 21:48:53    

salut mrbebert
 
nn ça marche pas. il ne veut pas que l"alias "la_somme" soit utilisé dans 2 requetes . Merci tout de même pour la suggestion.

Reply

Marsh Posté le 26-04-2011 à 22:13:13    

L'erreur m'étonne [:darkmavis xp]  
Je donne un nom à la colonne de la sous-requête pour l'utiliser facilement dans la requête principale, rien d'exceptionnel.
Essaie avec  :
select MAX(tb_a.la_somme) from (
...


---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 27-04-2011 à 08:38:30    

rebonjour mrbebert
 
ben non y veut pas ! toujours la même erreur "Every derived table must have its own alias". Je pense qu'il apprécie pas que le champ aggrégué soit utilisé dans une sous requête + requête principale en même temps.  
 
 
Mais j'ai trouvé une ruse pour m'en sortir différemment. Je rajoute un limit 1 comme ça je peux avoir le min et le max en triant cette liste par ordre croissant ou décroissant.  
 
Ca marche mais du coup je fais 2 requêtes au lieu d'en faire qu'une seule.  
 
Je mets résolu à moitié car ça me dépanne mais ne me satisfait pas complétement.
 
Dominique

Reply

Marsh Posté le 27-04-2011 à 08:47:29    

j'ai fini par trouvé, et j’avais mal lu ta réponse mrbebert. Fallait renommer la table (et tu l'avais bien écris). Donc ça marche, je uis une quiche en sql mais je progresse tous les jours.  
 
Merci pour tes réponses.  
dOminique

Reply

Sujets relatifs:

Leave a Replay

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