在MySQL/SQL中获取同一行的条件计数

在MySQL/SQL中获取同一行的条件计数,mysql,sql,group-by,Mysql,Sql,Group By,假设我有一张桌子,Foo,看起来像这样: ID | Name | Gender | Team 1 | Bob | Male | A 2 | Amy | Female | A 3 | Cat | Female | B 4 | Dave | Male | B 5 | Evan | Male | B 如果我想得到同一排每个队的男女人数列表,我会怎么做 我知道我可以选择COUNTName作为,Team,Gender,从foo组中逐个Tea

假设我有一张桌子,Foo,看起来像这样:

ID  | Name  | Gender  | Team
1   | Bob   | Male    | A
2   | Amy   | Female  | A
3   | Cat   | Female  | B
4   | Dave  | Male    | B
5   | Evan  | Male    | B
如果我想得到同一排每个队的男女人数列表,我会怎么做

我知道我可以选择COUNTName作为,Team,Gender,从foo组中逐个Team,Gender,这对于大多数目的来说都很好

但这会给我每个队2排,就像下面,这可能是一个痛苦

#  Team Gender
1 | A | Male
1 | A | Female
1 | B | Female
2 | B | Male
如何构造查询,使它们显示在同一行上

征求意见

现在想象一下,每一行在一个分数列中都有一个与之关联的任意数字分数。我怎么会有“男性积分”和“女性积分”?如果性别=男性,则选择其他0个男性终点点,是否会出现这种情况

你很接近。答案是

select team,
 SUM(case when gender='Male' then 1 else 0 end) Male,
 SUM(case when gender='Male' then points else 0 end) `Male Points`,
 SUM(case when gender='Female' then 1 else 0 end) Female,
 SUM(case when gender='Female' then points else 0 end) `Female Points`
from tbl
group by team

我所寻找的模式是自连接;在我看来,语法和逻辑比CASE模式更优雅

具体来说,

SELECT Males.Team, COUNT(Males.id) as "Males", SUM(Males.Points) as "Male Points", 
       COUNT(Females.id) as "Females", SUM(Females.Points) as "Female Points" 
FROM scores as Males 
LEFT JOIN scores as Females ON Males.Team=Females.Team AND Females.Gender="Female" 
WHERE Males.Gender="Male" 
GROUP BY Team

我希望不同列中的分组被拆分为同一表的各自副本,而不是case语句。然后,你加入一组男性球员和一组女性球员,然后按团队分组

我会接受的,但我意识到我的问题中遗漏了一个细节:现在想象一下,每一行都有一个任意的数字分数与之关联,在分数列中。我怎么会有“男性积分”和“女性积分”?如果性别=男性,然后选择其他0个结束男性分数,这会是一种情况吗?因为逻辑比Richard的更容易理解,我认为这是非常主观的。我理解这两种解决方案是如何工作的,但我的大脑对Richard基于案例的解决方案感觉更舒服。这并不是说你的答案是错的或不是很好;我只是说,并不是每个人都会同意两种解决方案中哪一种更直观。@ean5533有道理。编辑它以反映这一点。我还想知道性能。我猜,但不知道,连接方法更快,因为过滤只在连接时发生一次,而不是在每个CASE语句中发生,尽管可以想象SQL引擎可以为此进行优化。性能也是我考虑的一件事。我只知道SQL性能调优的基础知识,所以我也不知道哪个查询会更快;它可能严重依赖于DBMS。我确实知道,如果团队不是一个索引列,那么连接速度会非常慢。但是,根据我的直觉,如果有适当的索引,join方法会更快。
select team,
 SUM(case when gender='Male' then 1 else 0 end) Male,
 SUM(case when gender='Male' then points else 0 end) `Male Points`,
 SUM(case when gender='Female' then 1 else 0 end) Female,
 SUM(case when gender='Female' then points else 0 end) `Female Points`
from tbl
group by team
SELECT Males.Team, COUNT(Males.id) as "Males", SUM(Males.Points) as "Male Points", 
       COUNT(Females.id) as "Females", SUM(Females.Points) as "Female Points" 
FROM scores as Males 
LEFT JOIN scores as Females ON Males.Team=Females.Team AND Females.Gender="Female" 
WHERE Males.Gender="Male" 
GROUP BY Team