我怎么能GROUP BY这个SQL查询?

时间:2016-09-28 16:42:42

标签: sql sql-server sql-server-2008

我有这个SQL查询,并且我尝试过多种方式进行分组,但它对我不起作用,我希望按 noExp

select Alumnos.nombreComp as Nombre, 
       Carreras.nombre as Carrera, 
       Alumnos.noExp as Expediente, 
       Historial.fecha as Fecha, 
       Historial.equipo as Equipo 
from Alumnos, Historial, Carreras 
where YEAR(fecha)= @año 
  and MONTH (fecha)=@Mes 
  and Historial.noExp = Alumnos.noExp 
  and Alumnos.carrera = Carreras.id_carrera 
  and Alumnos.activo = 1

帮助!

4 个答案:

答案 0 :(得分:2)

  1. 您应该使用正确的连接语法INNER JOIN来获取表格和OUTER JOIN之间的匹配,以便在匹配时获得匹配但即使一方没有匹配也仍然可以获取记录
  2. 要使用GROUP BY,您需要一个Aggregate Function,目前您还没有,并且您提到了您希望在数据中看到的聚合类型,因此添加一个聚合没有意义。
  3. 具有正确连接语法的SQL代码

    SELECT Alumnos.nombreComp as Nombre
        , Carreras.nombre as Carrera
        , Alumnos.noExp as Expediente
        , Historial.fecha as Fecha
        , Historial.equipo as Equipo 
    FROM Alumnos INNER JOIN Historial ON Historial.noExp = Alumnos.noExp
        INNER JOIN Carreras ON Alumnos.carrera = Carreras.id_carrera 
    WHERE YEAR(fecha)= @año 
        AND MONTH (fecha)=@Mes 
        AND Alumnos.activo = 1
    

答案 1 :(得分:0)

因此,对于SQL Server,您必须按查询的select子句中提到的每个列进行分组。 SQL Server需要知道如何组织所有列。如果您希望按noExp进行分组,然后将其列为第一个分组选项,然后按照您的数据需要显示的顺序列出组中的后续列,将获得主要按noExp分组的列表。

select 
Alumnos.nombreComp as Nombre, 
Carreras.nombre as Carrera,
 Alumnos.noExp as Expediente, 
Historial.fecha as Fecha, Historial.equipo as Equipo 

from Alumnos, Historial, Carreras 
where YEAR(fecha)= @año 
and MONTH (fecha)=@Mes 
and Historial.noExp = Alumnos.noExp 
and Alumnos.carrera = Carreras.id_carrera 
and Alumnos.activo = 1
GROUP BY Alumnos.noExp, Alumnos.nombrecomp,Carreras.nombre,Historial.fecha

答案 2 :(得分:0)

如果您只想使用一个字段进行分组,而不是使用MAX关键字,请按以下方式编写查询。

select MAX(Alumnos.nombreComp) as Nombre,
 MAX(Carreras.nombre) as Carrera, 
Alumnos.noExp as Expediente,
 Max(Historial.fecha) as Fecha,
 Max(Historial.equipo) as Equipo
 from Alumnos, Historial, Carreras 
where YEAR(fecha)= @año and MONTH (fecha)=@Mes
 and Historial.noExp = Alumnos.noExp 
and Alumnos.carrera = Carreras.id_carrera 
and Alumnos.activo = 1
GROUP By Alumnos.noExp

答案 3 :(得分:0)

对于使用group by子句,你应该在查询中使用一些聚合函数,比如avg()。在你要使用group by子句的字段上使用聚合函数。