如何在NorthWind SQL Server上执行聚合?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在NorthWind SQL Server上执行聚合?相关的知识,希望对你有一定的参考价值。

我正在尝试聚合NorthWind表ProductsCategories,以便我可以获得产品类别名称列表,每个类别中的产品数量

到目前为止代码尝试:

SELECT 
    Categories.CategoryName, Categories.CategoryID
FROM 
    Categories 
LEFT JOIN 
    Products ON Products.CategoryID = Categories.CategoryID;

上面的代码显示了类别。但是,当我按类别ID执行分组时,它显示错误说明

列'Categories.CategoryName'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

我不确定是什么问题。

注意:我是SQL Server的新手

答案

GROUP BY的正确语法是:

SELECT c.CategoryName, c.CategoryID, COUNT(p.CategoryID)
FROM Categories c LEFT JOIN
     Products p
    ON p.CategoryID = c.CategoryID
GROUP BY c.CategoryName, c.CategoryID;

请注意,这会引入表别名,这使查询更容易编写和读取。

SELECT中所有未聚合的列都在GROUP BY中。

另一答案

添加GROUP BY后,除了GROUP BY子句中出现的表达式或任何其他子集合函数之外,您不能再引用原始集合中的任何元素。原因是在GROUP BY之后,该组将由每个组包含一行,并且唯一保证相同的值是GROUP BY Expression。对于所有其他列,您必须保证单个值,并且唯一的方法是使用聚合函数 - 根据定义,它采用一组值,并返回单个值。这就是为什么如果您使用GROUP BY类别ID,则无法引用类别名称。因为我认为在你的情况下它们是功能相关的,你既可以添加到GROUP BY子句,也可以将虚拟聚合添加到类别名称。

SELECT Categories.CategoryName, Categories.CategoryID, COUNT(*) AS CountProducts
FROM   Categories 
       LEFT JOIN 
       Products 
       ON Products.CategoryID=Categories.CategoryID
GROUP BY Categories.CategoryName, Categories.CategoryID

OR

SELECT MAX(Categories.CategoryName) AS CategoryName, Categories.CategoryID, COUNT(*) AS CountProducts
FROM   Categories 
       LEFT JOIN 
       Products 
       ON Products.CategoryID=Categories.CategoryID
GROUP BY Categories.CategoryID

以上是关于如何在NorthWind SQL Server上执行聚合?的主要内容,如果未能解决你的问题,请参考以下文章

Northwind数据库不能在SQL Server 2012上创建

SQL Server调优系列基础篇(索引运算总结)

[SQL Server] 复制数据库任务

如何从SQL表中选择特定行并在SQL Server中连接多个表?

SQL Server调优系列基础篇

从 jTable 更新 SQL Server 表