【问题标题】:表达式不在聚合或 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
    相关资源
    最近更新 更多