2013-10-30 28 views
21

我正在嘗試構建一個查詢,告訴我在給定數據集中有多少個不同的女性和男性。該人由一個電話號碼標識。同一個'tel'可能出現多次,但'tel的性別只應該被計算一次!如果條件唯一,MySQL不同計數

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過濾。

+1

你想說什麼作爲回答,當你跑的? –

+0

'COUNT(DISTINCT tel,gender ='male')'錯誤地給出man_count = 4;它應該是3 - 每個電話唯一。 – Federico

+0

SUM(如果(gender ='female',1,0))錯誤地給出了woman_count = 2。它應該是1(每個電話唯一) – Federico

回答

54

下面是一個使用子查詢一個選項與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 
+4

'DISTINCT CASE WHEN gender ='male'THEN tel END'完美無缺。這是我尋找的解決方案。謝謝!! – Federico

+0

COUNT(DISTINCT CASE WHEN)也正是我所期待的,非常感謝。 – balslev

+0

COUNT(DISTINCT CASE WHEN)爲我工作。非常感謝。 – Madhura