繁体   English   中英

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

[英]MySQL distinct count if conditions unique

我正在尝试构建一个查询,该查询告诉我在给定数据集中有多少不同的女性和男性。 此人由数字“电话”标识。 同一个“电话”可能会出现多次,但“电话的性别”只能计算一次!

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) COUNT(DISTINCT tel, gender = 'male') as man_count相同的值——它没有考虑到那里的限定符。 并且SUM(if(gender = 'female', 1, 0))计算所有女性记录,但不会被 DISTINCT 电话过滤。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM