我试图在表格的性别字段中计算女性和男性的数量。
有没有办法在一个查询中获取每个查询的数量?
类似的东西:
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';
答案 0 :(得分: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
或使用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;
答案 1 :(得分: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
将返回相同的值。
如果要避免使用MySQL IF
函数,也可以使用ANSI SQL CASE
表达式来完成:
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
答案 2 :(得分: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 ...
应该工作得很好!
答案 3 :(得分:0)
如果你唯一的问题是避免两个查询,你总是可以写两个查询作为一个查询的子选择。
选择(从双音色中选择1)作为一个,(从双音色中选择2)作为双音色中的两个
这也适用于您的场景。