如果条件唯一,MySQL独特计数

时间:2013-10-30 01:04:34

标签: 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;

实际上有两次尝试。 COUNT(DISTINCT tel, gender = 'male') as man_count似乎只返回与COUNT(DISTINCT tel, gender)相同的内容 - 它没有考虑那里的限定符。并且SUM(if(gender = 'female', 1, 0))计算所有女性记录,但不会被DISTINCT tels过滤。

2 个答案:

答案 0 :(得分:62)

这是使用带有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

答案 1 :(得分:0)

还有另一种解决方案,类似于@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

说明:

IF(gender = "male", tel, NULL)

如果性别是男性,则上述表达式将返回tel,否则将返回NULL值

那么我们

DISTINCT

它将删除所有重复项

最后

COUNT(DISTINCT IF(gender = "male", tel, NULL))

将统计男性性别行中所有不同的出现次数

注意:带有表达式的SQL COUNT函数仅对具有非NULL值的行进行计数, 有关详细说明,请检查-http://www.mysqltutorial.org/mysql-count/

相关问题