Fed*_*ico 26 mysql sql count distinct
我正在尝试构建一个查询,告诉我在给定的数据集中有多少不同的女性和男性.该人员由数字'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;
Run Code Online (Sandbox Code Playgroud)
实际上有两次尝试.COUNT(DISTINCT tel, gender = 'male') as man_count似乎只是返回相同COUNT(DISTINCT tel, gender)- 它没有考虑那里的限定符.并SUM(if(gender = 'female', 1, 0))计算所有女性记录,但不会被DISTINCT tels过滤.
sge*_*des 66
这是使用子查询的一个选项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
Run Code Online (Sandbox Code Playgroud)
如果您不想使用子查询,这也可以使用:
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
Run Code Online (Sandbox Code Playgroud)
还有一个类似于@segeddes 的第二个解决方案的解决方案
Select COUNT(DISTINCT tel) as gender_count,
COUNT(DISTINCT IF(gender = "male", tel, NULL)) as male_count,
COUNT(DISTINCT IF(gender = "female", tel, NULL)) as female_count
FROM example_dataset
Run Code Online (Sandbox Code Playgroud)
解释 :
IF(gender = "male", tel, NULL)
Run Code Online (Sandbox Code Playgroud)
如果性别是男性,上面的表达式将返回 tel 否则它将返回 NULL 值
那我们就
DISTINCT
Run Code Online (Sandbox Code Playgroud)
它将删除所有重复项
最后
COUNT(DISTINCT IF(gender = "male", tel, NULL))
Run Code Online (Sandbox Code Playgroud)
将计算所有不同出现的具有男性性别的行
注意:带有表达式的 SQL COUNT 函数只计算具有非 NULL 值的行,详细解释检查 - http://www.mysqltutorial.org/mysql-count/