Si je reprends mon calcul que tu as corrigé en ajoutant la parenthèse manquante :
(100 * ABS(c.note - tmp.note) )/ tmp.note
Soit 20 la note de référence, c'est à dire tmp.note.
Soit 10 l'autre note à évaluer, c'est à dire c.note.
c.note - tmp.note = 10 - 20 = -10
ABS(c.note - tmp.note) = valeur absolue de -10 = 10
(100 * ABS(c.note - tmp.note) ) = 1000
(100 * ABS(c.note - tmp.note) )/ tmp.note = 1000 / 20 = 50%=> La note à évaluer est à 50% de la note de référence.
Si la note à évaluer est 30, l'écart sera le même (30 - 20 = 10) et donc le pourcentage de distance aussi.
Prenons maintenant une note à évaluer de 18.
c.note - tmp.note = 18 - 20 = -2
ABS(c.note - tmp.note) = valeur absolue de -2 = 2
(100 * ABS(c.note - tmp.note) ) = 200
(100 * ABS(c.note - tmp.note) )/ tmp.note = 200 / 20 = 10%=> La note à évaluer est à 10% de la note de référence. et 18 est bel et bien plus près de 20 (distance moins grande) que 10.
Mais, si j'ai bien compris, tu veux le pourcentage de la note à évaluer par rapport à la note de référence ?
100 * (1 - (ABS(c.note - tmp.note) / tmp.note))
Pour une note à évaluer de 18, nous aurons cette fois :
100 * (1 - (ABS(18 - 20) / 20)) =
100 * (1 - (ABS(-2) / 20)) =
100 * (1 - (2 / 20)) =
100 * (1 - 0,1) =
100 * (0,9) =
90%
La requête devrait donc être celle-ci si tu veux trier à partir du plus proche :
1 2 3 4 5 6 7 8 9 10 11
| SELECT c.prenom, c.note,
tmp.note AS note_reference,
100 * (1 - (ABS(c.note - tmp.note) / tmp.note)) AS ecart_pourcent
FROM classe c
CROSS JOIN
(
SELECT note
FROM classe
WHERE prenom = 'paul'
) tmp
ORDER BY ecart_pourcent DESC |
Partager