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

问题描述 投票:0回答:2

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

到目前为止代码尝试:

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

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

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

我不确定是什么问题。

注意:我是SQL Server的新手

sql sql-server aggregate aggregate-functions
2个回答
1
投票

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中。


0
投票

添加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
© www.soinside.com 2019 - 2024. All rights reserved.