如果条件唯一,则 MySQL 不同计数

Posted

技术标签:

【中文标题】如果条件唯一,则 MySQL 不同计数【英文标题】:MySQL distinct count if conditions unique 【发布时间】:2013-11-09 10:06:53 【问题描述】:

我正在尝试构建一个查询,告诉我给定数据集中有多少不同的女性和男性。该人由数字“电话”标识。同一个 '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 电话过滤。

【问题讨论】:

当你运行这个时你得到了什么答案? COUNT(DISTINCT tel, gender = 'male') 错误地给出了 man_count = 4;它应该是 3 -- 每个电话唯一。 SUM(if(gender = 'female', 1, 0)) 错误地给出了 woman_count = 2。它应该是 1(每个电话唯一) 【参考方案1】:

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

如果您不想使用子查询,这也可以:

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
More Fiddle

【讨论】:

DISTINCT CASE WHEN gender = 'male' THEN tel END 工作完美。这是我正在寻找的解决方案。谢谢!! COUNT(DISTINCT CASE WHEN ) 也正是我想要的,非常感谢。 COUNT(DISTINCT CASE WHEN) 为我工作。非常感谢。【参考方案2】:

还有一个类似于@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/

【讨论】:

以上是关于如果条件唯一,则 MySQL 不同计数的主要内容,如果未能解决你的问题,请参考以下文章

Excel计数满足多个条件的唯一不同值

MySQL INSERT插入条件判断:如果不存在则插入

postgresql 在不同条件下计数不同

需要帮助编写查询以获取总计数和唯一计数

Hive:如果两个表之间满足条件,则查找唯一值

在excel中获得两个条件的唯一计数