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

标签 sql sql-server tsql 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

是的,有 2 个类(class)具有相同的名称(数学),因为它们可能在不同的时间。我想获得一份类(class)列表以及每个类(class)注册的学生人数。我想要以下列(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

(注意我想按 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."

谢谢!

最佳答案

不可以,SQL Server 不允许您省略 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

您可以使用以下方法根据计数得出表格:

  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

关于sql - 我可以在 SQL 的聚合函数中包含非聚合列而不将其放入 GROUP BY 子句中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4821779/

相关文章:

sql - 将 GETDATE 与 DATEDIFF 一起使用?

SQL Unpivot/Coalesce 多列基于值的一列

sql - 同时使用 RANK 和 COUNT(DISTINCT) 聚合

对表的子查询而不是整个表进行 Join 时的 SQL 性能差异

c# - 使用smo在SqlServer中创建用户的问题

sql - 如何从 SQL Server 中的 varchar 列中提取电话号码?

tsql - 插入后获取新记录的ID

sql - 使用 SQL Server 从复杂的 XML 结构中读取值

mysql - SELECT count(*) 比 SELECT count(*) 慢两倍,MySQL 中的 some_column

sql - 从两列中选择非不同的行