MySQL - Calcul de centile, mediane

Résolu
victorberson Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai une base de données avec des notes, des matière etc... et je souhaite calculer des centiles de ces moyennes.
J'ai déjà créer une requête qui m'affiche toutes les moyennes dans une matière :

SELECT id_matiere, ROUND(SUM(moyenne * matiere_module.coef)/ SUM(matiere_module.coef), 2) as moyenneMa, id_etu
FROM matiere_module,
(
SELECT module, id_etu, SUM(note*coef)/ SUM(coef) as moyenne
FROM bulletin
WHERE promo = '2022'
GROUP BY module, id_etu
) as moyennes
WHERE nom_module = module AND id_matiere = '3'
GROUP BY id_matiere, id_etu


Je cherche maintenant a calculer le 20% centile, le 40%centile etc...
En fouillant sur google, j'ai trouvé cette requete :


SELECT
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(
GROUP_CONCAT(field_name ORDER BY field_name SEPARATOR ','),
',', 95/100 * COUNT(*) + 1), ',', -1) AS DECIMAL) AS `95th Per`
FROM table_name;


Je l'ai essayé sur une table test avec juste des moyennes, et elle fonctionne. Par contre je n'arrive pas a la faire fonctionner avec ma requete précédente...

Merci d'avance pour vos idées et votre aide

Victor

Configuration: Windows / Firefox 68.0
A voir également:

1 réponse

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour, qu'as-tu essayé?
1
victorberson Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   5
 
J'ai essayé ceci :


SELECT
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(
GROUP_CONCAT(moyenneMa ORDER BY moyenneMa SEPARATOR ','),
',', 49/100 * COUNT(*) + 1), ',', -1) AS DECIMAL) AS `95th Per`
FROM (SELECT id_matiere, ROUND(SUM(moyenne * matiere_module.coef)/ SUM(matiere_module.coef), 2) as moyenneMa, id_etu
FROM matiere_module,
(
SELECT module, id_etu, SUM(note*coef)/ SUM(coef) as moyenne
FROM bulletin
WHERE promo = '2022'
GROUP BY module, id_etu
) as moyennes
WHERE nom_module = module AND id_matiere = '3'
GROUP BY id_matiere, id_etu ) as moyenneG
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > victorberson Messages postés 139 Date d'inscription   Statut Membre Dernière intervention  
 
et cela a donné quoi?
0
victorberson Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   5
 
11 alors que les moyennes sont : 10.96; 9.61;10.63
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > victorberson Messages postés 139 Date d'inscription   Statut Membre Dernière intervention  
 
avais-tu uniquement des nombres entiers dans ta table de test?
0
victorberson Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   5
 
Non, même avec des nombres décimaux cela fonctionne sur ma table test. Le résultat est un entier (il supprime la partie décimale) mais il donne le bon résultat. Si le résultat etait le nombre décimal exact ca serait encore mieux mais bon.. j'essaie déjà d'adapter la requete
0