2

我试图在表格的性别字段中计算女性和男性的数量。

有没有办法在一个查询中获取每个的计数?

就像是:

select * from table count(where gender = 'm') as total_males, count(where gender = 'f') as total_females;

还是需要两个查询?

select count(*) from table where gender = 'm';
select count(*) from table where gender = 'f';
4

4 回答 4

3

这基本上是一个PIVOT. MySQL 没有枢轴,因此您可以使用带有CASE语句的聚合函数来执行此操作:

select
  sum(case when gender = 'm' then 1 else 0 end) Total_Male,
  sum(case when gender = 'f' then 1 else 0 end) Total_Female
from yourtable

请参阅带有演示的 SQL Fiddle

或使用COUNT

select
  count(case when gender = 'm' then 1 else null end) Total_Male,
  count(case when gender = 'f' then 1 else null end) Total_Female
from yourtable;

请参阅带有演示的 SQL Fiddle

于 2012-12-11T19:22:29.637 回答
2

像这样的东西会起作用:

SELECT SUM(IF(t.gender='m',1,0)) AS total_males
     , SUM(IF(t.gender='f',1,0)) AS total_females
  FROM mytable t

这里的“技巧”是我们使用条件测试为每一行返回 0 或 1,然后将 0 和 1 相加。为了使这一点更清楚一点,我使用SUM聚合函数而不是COUNT,尽管COUNT可以很容易地使用,尽管我们需要返回一个 NULL 来代替零。

SELECT COUNT(IF(t.gender='m',1,NULL)) AS total_males
     , COUNT(IF(t.gender='f',1,NULL)) AS total_females
  FROM mytable t

考虑此查询的 SELECT 列表中的两个表达式:

SELECT COUNT(1) 
     , SUM(1)
  FROM mytable t 

将返回相同的值。

如果要避免使用 MySQLIF函数,也可以使用 ANSI SQLCASE表达式来完成:

SELECT SUM( CASE WHEN t.gender = 'm' THEN 1 ELSE 0 END )) AS total_males
     , SUM( CASE WHEN t.gender = 'f' THEN 1 ELSE 0 END )) AS total_females
  FROM mytable t
于 2012-12-11T19:21:54.183 回答
1
select sum(case when gender='m' then 1 else null end) as total_males,  sum(case when gender='f' then 1 else null end) as total_females from ... 

应该工作得很好!

于 2012-12-11T19:22:02.053 回答
0

如果您唯一的问题是避免两个查询,您总是可以编写两个查询作为一个查询的子选择。

select (select 1 from dual) as one, (select 2 from dual) as two from dual

这也适用于您的场景。

于 2012-12-11T19:23:32.713 回答