2013-10-30 10 views
21

Próbuję zbudować zapytanie, które mówi mi, ile różnych kobiet i mężczyzn znajduje się w danym zbiorze danych. Osoba jest identyfikowana przez numer "tel". Możliwe, że ten sam "tel" pojawi się wiele razy, ale że "płeć tel powinna być liczona tylko jeden raz!Liczba odrębna MySQL, jeśli warunki są unikalne

7136609221 - mężczyźni
7136609222 - mężczyźni
7136609223 - kobieta
7136609228 - mężczyźni
7136609222 - mężczyźni
7136609223 - kobieta

to example_dataset dawałoby następuje.
całkowitą liczbę unikalnych płeć: 4
Razem wyjątkowy mężczyzna count: 3
Razem wyjątkowy żeński Ilość: 1

Moje nieudane zapytanie:

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; 

Jest rzeczywiście dwóch próbach tam. COUNT(DISTINCT tel, gender = 'male') as man_count wydaje się po prostu zwracać to samo, co COUNT(DISTINCT tel, gender) - nie uwzględnia tam kwalifikatora. I SUM(if(gender = 'female', 1, 0)) zlicza wszystkie kobiece rekordy, ale nie jest filtrowany przez DISTINCT tels.

+1

Do czego jako odpowiedź po uruchomieniu tego? –

+0

'COUNT (DISTINCT tel, gender = 'male')' daje man_count = 4 błędnie; powinno być 3 - unikalne na tel. – Federico

+0

SUMA (jeśli (gender = 'female', 1, 0)) daje woman_count = 2, błędnie. Powinien wynosić 1 (unikalny na tel) – Federico

Odpowiedz

54

Oto jedna opcja za pomocą podzapytania z 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 

ta będzie również działać, jeśli nie chcesz używać podkwerenda:

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 
+4

'WYSTĘPOWANIE W PRZYPADKU płci =" mężczyzna "TO tel. END" działało idealnie. To było rozwiązanie, którego szukałem. Dzięki!! – Federico

+0

COUNT (DISTINCT CASE WHEN) było również dokładnie tym, czego szukałem, wielkie dzięki. – balslev

+0

COUNT (DISTINCT CASE WHEN) pracował dla mnie. Dziękuję bardzo. – Madhura