我可以在SQL中的聚合函数中包含非聚合列而不将其放入GROUP BY子句中吗?

Jus*_*tin 5 sql t-sql sql-server group-by aggregate

请看下面的表......

Classes
ClassId ClassName
1       Math
2       Math
3       Science
4       Music

Registrations
RegistrationId ClassId StudentName
1              1       Stu
2              1       Rick
3              2       John
4              4       Barb
5              4       Dan
6              3       Einstein
Run Code Online (Sandbox Code Playgroud)

是的,有两个同名(Math)的课程可能在不同的时间.我想获得一个班级列表和每个学生注册的学生人数.我想要以下列(ClassId,ClassName,StudentCount).

我对此的尝试将是......

SELECT Classes.ClassId, Classes.ClassName, Count(Registrations.RegistrationId)
FROM Classes
INNER JOIN Registrations ON Classes.ClassId = Registrations.ClassId
GROUP BY Classes.ClassId
Run Code Online (Sandbox Code Playgroud)

(注意我想GroupBy ClassId但不是ClassName).这在SQLServer 2008中是否可行?显然我问,因为SQL抱怨

"ClassName is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."
Run Code Online (Sandbox Code Playgroud)

谢谢!

OMG*_*ies 11

不,SQL Server不允许您省略GROUP BY中未包含在聚合函数中的列.包含类名称没有坏处,因为group by将按列组合执行:

  SELECT c.classid, 
         c.classname, 
         COUNT(r.registrationid)
    FROM CLASSES c
    JOIN REGISTRATIONS r ON r.classid = c.classid
GROUP BY c.classid, c.classname
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法派生基于计数的表:

  SELECT c.classid, 
         c.classname, 
         r.num
    FROM CLASSES c
    JOIN (SELECT t.classid,
                 COUNT(*) AS num
            FROM REGISTRATIONS t
        GROUP BY t.classid) r ON r.classid = c.classid
Run Code Online (Sandbox Code Playgroud)


Joe*_*lli 5

在GROUP BY语句中包含Classes.ClassName应该没有任何害处.您将通过不同的ClassId和ClassName对进行分组,因此(1,'Math')和(2,'Math')仍然是两个不同的分组.