【问题标题】:表达式不在聚合或 GROUP BY 列中
【发布时间】:2022-01-10 21:21:24
【问题描述】:

我有一个包含以下列的表: ProductID、ProductName、Price、CategoryID。

目标是打印最昂贵产品的所有详细信息(ProductID、ProductName、Price 和 Category)。

我执行了以下查询:

str = "SELECT ProductID, ProductName, MAX(Price) AS MaxPrice, CategoryID FROM Products;";   

但是,出现了标题中提到的异常,我没有找到异常出现的原因。我搜索了以下链接的解释:

我也在SQL Lesson 10: Queries with aggregates (Pt. 1)阅读和练习过 根据我在 SQLBolt 中的检查,我编写查询的方式是可以接受的。

阅读和练习后,我仍然不明白为什么我需要在这里使用 GROUP BY。不是我需要呈现每组的最高价格...

非常感谢您!

【问题讨论】:

    标签: javascript sql group-by aggregate-functions


    【解决方案1】:

    您只需要一个ORDER BY 子句,例如:

    SELECT ProductID, ProductName, Price AS MaxPrice, CategoryID 
    FROM Products
    ORDER BY Price DESC 
    LIMIT 1
    

    LIMIT 1 将确保您只获取第一行。

    您收到错误是因为在聚合(sum、avg、max、min、count)一个数字列时,您需要告诉 SQL 您希望如何使用 GROUP BY 子句对数据进行分组。例如,如果您想查找每个 ProductName 的最高价格,您必须在 ProductName 上使用 GROUP BY:

    SELECT ProductName, MAX(Price) AS MaxPrice FROM Products GROUP BY ProductName
    

    Group by (SQL)

    为什么需要GROUP BY?

    sum() 比 max() 更容易理解,因为对于 SQL 来说,两者都是聚合函数。所以假设你想得到Price 的总和而不是最高价格,那么你会这样做:

    SELECT SUM(Price) AS Total FROM Products --will give the total of all the prices
    

    但如果您添加了非聚合列:

    SELECT ProductName, SUM(Price) AS Total FROM Products --will not work
    

    您会立即看到这是不可能的,因为会有多个产品名称,应该显示哪一个作为价格总和?。这就是为什么它会抛出要求使用group by 子句的错误。

    希望这会有所帮助!

    【讨论】:

    • 一些基于 SQL 的数据库使用 LIMIT,而另一些使用 TOP。你只需要在你正在使用的 SQL 中找到它的等价物。
    • 感谢您的回复。要求是使用聚合函数之一(如 MAX)。如果我使用 ORDER BY 和 LIMIT 那么它似乎是解决方法。我从 SQLBolt 研究过,它可以像我一样做,而不使用 GROUP BY。如果我按照您所写的那样将 GROUP BY 与 ProductName 一起使用,那么它不会满足基本要求 - “...打印有关最昂贵产品的所有详细信息(ProductID、ProductName、Price 和 Category)。”
    • @Modern 请分享您阅读该内容的 URL,并说明您使用的是哪个数据库?因为我检查并发现您的查询可以在 SQLite 中运行,但在 MySQL 中会引发错误。阅读:stackoverflow.com/a/11073406/7940996
    • 再次感谢您的回复。我正在使用 Access(Microsoft Access 数据库)。
    • 再次感谢您的回复。问题是我必须使用 Access(Microsoft Access 数据库)。这意味着,我必须使用您提到的 GROUP BY,尽管我没有找到太多这样做的逻辑。另一种选择是创建一个子查询str = "SELECT ProductID, ProductName, Price AS MaxPrice, CategoryID FROM Products WHERE Price = (SELECT MAX(Price) FROM Products);"; 它可以工作,但同样,这不是我想要的。
    猜你喜欢
    • 2017-05-24
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多