2010-04-23 6 views
8

Je Hava sql comme ci-dessous: colonnes count groupe par

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

et obtenir le résultat:

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

Je veux résumé, le num des étudiants pour chaque département comme ci-dessous:

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

Comment dois-je écrire le sql?

+0

Regardez les gens de résultats, notez le 2 après CS et EE depts – BlackICE

+0

@zhangzhong: quelle base de données? –

Répondre

14

Bien qu'il semble que vous ne montrez pas toutes les tables, je ne peut que supposer qu'il y a un autre tableau de l'effectif réel par étudiant

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

Si vous voulez le nombre total de eac département h associée à chaque élève (qui n'a pas de sens), vous aurez probablement à le faire comme ...

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 

Mon interprétation de votre colonne « Nom » est le nom de l'étudiant et non celui de l'instructeur réel de la classe d'où mon sous-select/join. Sinon, comme les autres, il suffit d'utiliser COUNT (*) comme troisième colonne.

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 

Cette requête est quelque peu discutable, car vous obtenez des copies des comptages des départements. Il serait plus propre d'aller chercher la liste des élèves et le département compte comme des résultats distincts. Bien sûr, il peut y avoir des raisons pragmatiques d'aller dans l'autre sens, alors ce n'est pas une règle absolue.

+1

faux, cela donne 1 après les depts – BlackICE

+0

Merci de le signaler @David. –

+0

version corrigée est correcte, et je pense est en fait plus propre SQL que les deux autres qui sont corrects. – BlackICE

0

Cela devrait le faire (je n'ai pas d'environnement pour tester sur au min)

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

HTH

+0

cela donne également 1 après le département – BlackICE

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

cela donne également 1 après le département – BlackICE

0

Ou Sinon, écrivez simplement

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

cela donne également 1 après le dept – BlackICE

0

Cela donnera les résultats demandés ci-dessus

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