2010-04-23 19 views
8

I Hava sql jak poniżej: liczba kolumn grupa przez

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

i uzyskać wynik:

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

chcę Podsumowując Num studentów dla każdego departamentu, jak poniżej:

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

Jak mam napisać sql?

+0

spojrzeć na wyniki osób, zwróć uwagę na 2 po CS i EE depts – BlackICE

+0

@zhangzhong: co do bazy danych? –

Odpowiedz

14

Chociaż wydaje się, że nie są wyświetlane wszystkie tabele, ja można założyć, że istnieje inna tabela rzeczywistej rejestracji na studenta:

Jeśli chcesz całkowitą liczbę eac Dział h związany z każdego ucznia (który nie ma sensu), prawdopodobnie będziesz musiał zrobić to jak ...

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 

Moja interpretacja swojej kolumnie „Nazwa” to nazwa, a nie, że od studenta rzeczywisty instruktor klasy, stąd mój sub-select/join. W przeciwnym razie, tak jak inni, wystarczy użyć COUNT (*) jako trzeciej kolumny.

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 

To jest dość wątpliwe zapytanie, ponieważ otrzymujesz duplikaty liczby działów. Byłoby czystsze, aby pobrać listę studentów, a wydział liczy się jako osobne wyniki. Oczywiście mogą istnieć pragmatyczne powody, aby przejść w drugą stronę, więc nie jest to regułą absolutną.

+1

źle, daje to 1 po depotach – BlackICE

+0

Dzięki za wskazanie, że na @David. –

+0

edytowana wersja jest poprawna, i myślę, że jest rzeczywiście czystszy SQL niż dwa pozostałe, które są poprawne. – BlackICE

0

To powinno wystarczyć (nie mam żadnego środowisko do testowania na na min)

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

HTH

+0

to również daje 1-sza po dept – BlackICE

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

to również daje 1-sza po dept – BlackICE

0

lub inaczej napisać po prostu

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

to daje również 1-sz po dept – BlackICE

0

To daje rezultaty postulowane powyżej

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