2010-04-23 4 views
8

Я хава SQL, как показано ниже: Количество столбцов группы по

select a.dept, a.name 
    from students a 
group by dept, name 
order by dept, name 

И получить результат:

dept name 
-----+--------- 
CS | Aarthi 
CS | Hansan 
EE | S.F 
EE | Nikke2 

Я хочу резюме НЮМ студентов для каждого отдела, как показано ниже:

dept name  count 
-----+-----------+------ 
CS | Aarthi | 2 
CS | Hansan | 2 
EE | S.F  | 2 
EE | Nikke2 | 2 
Math | Joel  | 1 

Как мне написать sql?

+0

посмотреть на результаты людей, обратите внимание на 2 после CS и EE Depts – BlackICE

+0

@zhangzhong: какие базы данных? –

ответ

14

Хотя кажется, вы не показываете все таблицы, я можно только предположить, что имеется еще одна таблица фактического зачисления на одного учащегося

select a.Dept, count(*) as TotalStudents 
    from students a 
    group by a.Dept 

Если вы хотите, чтобы общее количество eac отдел ч, связанный с каждым студентом (который не имеет смысла), вам, вероятно, придется сделать это как ...

select a.Dept, a.Name, b.TotalStudents 
    from students a, 
     (select Dept, count(*) TotalStudents 
      from students 
      group by Dept) b 
    where a.Dept = b.Dept 

Моей интерпретацией столбца «Имя» является именем студента и не то, что из фактический инструктор класса, следовательно, мой суб-выбор/соединение. В противном случае, как и другие, просто нужно использовать COUNT (*) в качестве третьего столбца.

6
select a.dept, a.name, 
     (SELECT count(*) 
      FROM students 
     WHERE dept = a.dept) 
    from students a 
group by dept, name 
order by dept, name 

Это несколько сомнительный запрос, так как вы получаете дубликаты экземпляров отдела. Было бы проще получить список учеников, и отдел будет считать отдельные результаты. Конечно, могут быть прагматические причины, чтобы идти в другую сторону, так что это не абсолютное правило.

+1

неверно, это дает 1-е после департаментов – BlackICE

+0

Спасибо, что указали, что вне @David. –

+0

отредактированная версия верна, и я думаю, что на самом деле это более чистый SQL, чем два других, которые являются правильными. – BlackICE

0

Это должно сделать это (я не получил каких-либо условий для тестирования на в мин)

select a.dept, a.name, count(a.*) as NumOfStudents 
from students a 
group by dept, name order by dept, name 

HTH

+0

это также дает 1 после департамента – BlackICE

1
SELECT dept, name, COUNT(name) as CT from students 
group by dept, name 
order by dept, name 
+0

это также дает 1 после департамента – BlackICE

0

Или иначе писать просто

select dept, name, count(name) as nostud from students group by dept, name order by dept, name 
+0

это также дает 1 после отдела – BlackICE

0

Это даст результаты запрошенные выше

select a.dept, a.name, cnt 
from student a 
join (
select dept, count(1) as cnt 
from student 
group by dept 
) b on b.dept = a.dept 
Смежные вопросы