8768 sujets

Développement web côté serveur, CMS

Bonjour ou bonsoir,

Je cherche à créer une requête en MySQL qui me permette d'avoir les différentes valeurs d'une colonne de DB et, en face, le pourcentage d'occurrences (fréquence) où ces valeurs sont utilisées, le tout trié du plus élevé au moins élevé

Autrement dit, sur une colonne nommée "sexe_appelant", je voudrais un tri selon la fréquence des valeurs de cette colonne et afficher à côté le pourcentage qui y est lié.

Un exemple :
Homme : 30%
Femme : 65%
Transgenre : 5%

J'ai tenté beaucoup de choses, mais c'est la panne sèche. Je suis à 100 km de parvenir à mes fins...

Pouvez-vous m'aider?

Merci d'avance !
Modifié par Reka (01 Nov 2015 - 15:13)
Tu peux déjà obtenir la liste de toutes les valeurs par nombre d'occurences décroissante avec quelque chose comme ça :


select * from (
select machin, count(machin) as nombre
from tatable
group by machin
)z order by nombre desc 


Pour afficher le pourcentage, ça se complexifie vite:


select * from (
select machin, count(machin) as nombre, 100.0 * count(machin) / (select count(*) from tatable) as pourcentage
from tatable
group by machin
)z order by nombre desc 


Avec un problème potentiel de performance qui va avec un count(*) répétitif. Le mieux c'est de calculer ces pourcentages avec le langage appelant (PHP, python, Java, etc.)
Ok, merci Quentin !
J'avais carrément oublié l'existence des sous-requêtes ou requêtes imbriquées, il va falloir que je relise.

Mais il n'empêche qu'en adaptant ta proposition de requête sous MySQL workbench, j'obtiens une erreur :
Error Code: 1248. Every derived table must have its own alias

Voici comment j'ai réadapté ta 1re proposition :
select * from (
select sexe_appelant as sexe, count(sexe_appelant) as nombre
from appels
group by sexe_appelant
) order by nombre desc 

D'abord, je n'ai qu'une table. Ensuite j'ai attribué des alias aux deux colonnes... Je ne vois pas où est le pépin... Smiley ohwell



Edit : Ok j'ai trouvé (pas besoin de requête imbriquée)... Je devais être crevée hier soir pour ne pas arriver à faire un truc aussi simple ! Smiley lol
select sexe_appelant, count(sexe_appelant)
from appels
group by sexe_appelant

Je fais donc le traitement restant en PHP, si c'est moins lourd. (J'ai le souvenir d'avoir appris au cours qu'il valait mieux privilégier MySQL pour les requêtes que de faire des opérations de ce genre via PHP, mais par facilité, je te suis)
Modifié par Reka (01 Nov 2015 - 15:12)
a écrit :
Je fais donc le traitement restant en PHP, si c'est moins lourd. (J'ai le souvenir d'avoir appris au cours qu'il valait mieux privilégier MySQL pour les requêtes que de faire des opérations de ce genre via PHP, mais par facilité, je te suis)


Ce qu'il faut surtout éviter côté php, c'est les requêtes dans les boucles ou des requêtes récursives.

Mais dans ce cas-ci, à mon avis, mieux vaut préférer php. Calculer les totaux c'est bien à MySQL de le faire, c'est son travail, mais les afficher en pourcentage c'est essentiellement un problème de présentation des données; et MySQL n'est pas là pour présenter les données, c'est de la complexification inutile.