如何在NorthWind SQL Server上执行聚合?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在NorthWind SQL Server上执行聚合?相关的知识,希望对你有一定的参考价值。
我正在尝试聚合NorthWind表Products
和Categories
,以便我可以获得产品类别名称列表,每个类别中的产品数量
到目前为止代码尝试:
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上创建