MySQL - Calcul de centile, mediane

Résolu
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

1 réponse

  1. Contributeur Ambassadeur
    bonjour, qu'as-tu essayé?
    1
    1. 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
    2. Contributeur Ambassadeur
      @victorbersonet cela a donné quoi?
      0
    3. 11 alors que les moyennes sont : 10.96; 9.61;10.63
      0
    4. Contributeur Ambassadeur
      @victorbersonavais-tu uniquement des nombres entiers dans ta table de test?
      0
    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