web-dev-qa-db-fra.com

Nombre distinct MySQL si les conditions sont uniques

J'essaie de construire une requête qui me dit combien il y a de femmes et d'hommes distincts dans un ensemble de données donné. La personne est identifiée par un numéro "tel". Il est possible que le même "tel" apparaisse plusieurs fois, mais ce "sexe de tel" ne doit être compté qu'une seule fois!

7136609221 - mâle
7136609222 - mâle
7136609223 - femelle
7136609228 - mâle
7136609222 - mâle
7136609223 - femelle

Cet exemple_dataset produirait ce qui suit.
Nombre total de sexes uniques: 4
Nombre total d'hommes uniques: 3
Nombre total de femmes uniques: 1

Ma tentative de requête:

SELECT COUNT(DISTINCT tel, gender) as gender_count, 
       COUNT(DISTINCT tel, gender = 'male') as man_count, 
       SUM(if(gender = 'female', 1, 0)) as woman_count 
FROM example_dataset;

Il y a en fait deux tentatives là-dedans. COUNT(DISTINCT tel, gender = 'male') as man_count semble simplement renvoyer la même chose que COUNT(DISTINCT tel, gender) - il ne prend pas en compte le qualificatif. Et la SUM(if(gender = 'female', 1, 0)) compte tous les enregistrements féminins, mais n'est pas filtrée par DISTINCT tels.

24
Federico

Voici une option utilisant une sous-requête avec DISTINCT:

SELECT COUNT(*) gender_count,
   SUM(IF(gender='male',1,0)) male_count,
   SUM(IF(gender='female',1,0)) female_count
FROM (
   SELECT DISTINCT tel, gender
   FROM example_dataset
) t

Cela fonctionnera également si vous ne souhaitez pas utiliser de sous-requête:

SELECT COUNT(DISTINCT tel) gender_count,
    COUNT(DISTINCT CASE WHEN gender = 'male' THEN tel END) male_count,  
    COUNT(DISTINCT CASE WHEN gender = 'female' THEN tel END) female_count
FROM example_dataset
62
sgeddes