2016-11-10 42 views
1

总值比方说,我有以下的学生数据:排序在SQL

classroom  gender student_id 
------------------------------------- 
First Grade M  123 
First Grade F  124 
First Grade F  125 
Second Grade M  126 
Third Grade M  127 
... 

我想产生以下结果:顶部由学生与细节每个总数下令3个最大的教室:

classroom   boys_count girls_count total_count 
-------------------------------------------------- 
Third Grade  30   30   60 
First Grade  20   5   25 
Fourth Grade  10   10   20 

我怎么能在SQL中做到这一点?如有必要,我可以使用特定的postrges功能。


我试过至今:在一些脚本语言

SELECT count(*) as total_count 
    , gender 
    , classroom 
ORDER BY 1 
GROUP BY classroom, gender 
LIMIT 3 

然后我重新组织的结果。但是这太慢了。我想用一个查询获得正确的结果

+2

这是一个非常基本的SQL查询。你知道这种语言吗? –

+0

这不是聚合。这是简单的补充和排序。 –

+0

@GordonLinoff True。我意识到我过分简化了我的真正问题。我会编辑我的问题 –

回答

1
select classroom as name, 
     sum(case when gender = 'M' then 1 else 0 end) as boys_count, 
     sum(case when gender = 'F' then 1 else 0 end) as girls_count, 
     count(*) as total_count 
from your_table 
group by classroom 
order by count(*) desc 
limit 3 
+0

有三种替代方法:'count(*)过滤器(其中性别='M')与boys_count','count(nullif(gender,'F'))作为boys_count'和'sum (gender ='M'):: int)作为boys_count'取决于你更可读的内容。 – Abelisto

+0

工作就像一个魅力。谢谢。 (不知道为什么,我试图“按性别分组”,只需按教室分组即可) –