2016-11-10 1 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

Есть три альтернативы BTW: 'count (*) filter (где gender = 'M') как boys_count',' count (nullif (пол, 'F')) как boys_count' и 'sum ((gender = 'M') :: int) как boys_count' В зависимости от того, что более читаемо для вас. – Abelisto

+0

Работал как шарм. Благодарю. (Не знаю почему, я пытался «группировать по полу». Просто группировка по классу - это путь) –