Подтвердить что ты не робот

MySQL отличается счетчиком, если условия уникальны

Я пытаюсь построить запрос, который говорит мне, сколько разных женщин и мужчин есть в данном наборе данных. Человек идентифицируется номером "tel". Возможно, что один и тот же "tel" появится несколько раз, но "пол tel должен учитываться только один раз!

7136609221 - мужчина, 7136609222 - мужчина, 7136609223 - женщина, 7136609228 - мужчина, 7136609222 - мужчина, 7136609223 - женщина

В примере example_dataset будет указано следующее. Всего уникальных пол: 4
Всего уникальных мужчин: 3
Всего уникальных женщин: 1

Мой запрошенный запрос:

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;

На самом деле там две попытки. COUNT(DISTINCT tel, gender = 'male') as man_count похоже, просто возвращает то же самое, что и COUNT(DISTINCT tel, gender) - он не учитывает классификатор. И SUM(if(gender = 'female', 1, 0)) подсчитывает все женские записи, но не фильтруется с помощью DISTINCT tels.

4b9b3361

Ответ 1

Здесь один параметр с использованием подзапроса с 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

Это также будет работать, если вы не хотите использовать подзапрос:

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

Ответ 2

Но при использовании "COUNT (DISTINCT CASE WHEN)", когда ваша агрегация пуста, в SQL возникает ошибка.