web-dev-qa-db-ja.com

条件が一意の場合、MySQLの個別カウント

特定のデータセットに女性と男性がそれぞれ何人いるかを示すクエリを作成しようとしています。個人は番号「tel」で識別されます。同じ「tel」が複数回出現する可能性がありますが、「tel」の性別は1回だけカウントする必要があります。

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;
_

実際には2つの試みがあります。 COUNT(DISTINCT tel, gender = 'male') as man_countCOUNT(DISTINCT tel, gender)と同じ結果を返すように見えますが、修飾子を考慮していません。また、SUM(if(gender = 'female', 1, 0))はすべての女性レコードをカウントしますが、DISTINCT telsによってフィルタリングされません。

24
Federico

DISTINCTでサブクエリを使用する1つのオプションを次に示します。

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
62
sgeddes