2010-04-23 24 views
8

I HAVA el SQL de la siguiente manera: recuento grupo de columnas por

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

y obtener el resultado:

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

Quiero resumen, el num de estudiantes en cada departamento de la siguiente manera:

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

¿Cómo debo escribir el sql?

+0

vistazo a los resultados que la gente, después de notar el 2 CS y EE depts – BlackICE

+0

@zhangzhong: ¿qué base de datos? –

Respuesta

14

Aunque parece que no está mostrando todas las mesas, me solo puede suponer que hay otra tabla de inscripción real por estudiante

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

Si desea la cuenta total de eac h departamento asociado a cada estudiante (que no tiene sentido), es probable que tenga que hacerlo así ...

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 

Mi interpretación de la columna "Nombre" es el nombre del estudiante y no la de el instructor real de la clase, por lo tanto, mi sub-seleccionar/unirme. De lo contrario, como otros, simplemente usar el COUNT (*) como tercera columna era todo lo que necesitabas.

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 

Esta es una consulta algo cuestionable, ya que obtiene copias duplicadas de los conteos del departamento. Sería más limpio buscar la lista de estudiantes y el departamento cuenta como resultados separados. Por supuesto, puede haber razones pragmáticas para ir por el otro lado, por lo que esta no es una regla absoluta.

+1

mal, esto da 1's después de los depts – BlackICE

+0

Gracias por señalar eso a @David. –

+0

versión editada es correcta, y creo que es en realidad SQL más limpio que los otros dos que son correctos. – BlackICE

0

Esto debe hacerlo (no tengo ningún medio para poner a prueba en el min)

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

HTH

+0

esto también da 1 después del departamento – BlackICE

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

esto también da 1 después del departamento – BlackICE

0

O De lo contrario, simplemente escribir

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

esto también da 1 después del departamento – BlackICE

0

Esto dará a los resultados solicitados por encima de

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 
Cuestiones relacionadas