我正在学习sql。一个任务是写表达式
SELECT MIN(Price), ProductName
FROM Products;
编辑https://www.w3schools.com/sql/trysql.asp?filename=trysql_op_in 并拍摄结果图像。
我的老师说这对他很好。当我这样做时,sql返回
您试图执行的查询不包括作为聚合函数一部分的指定表达式“productname”
我找到的答案包括改变程序的设置(我做不到)或者做一些我还没有学会的事情。为什么这个表达对我和我的老师有不同的回报,我能做些什么来改变这个?
4条答案
按热度按时间pu82cl6c1#
因为您不能为product name列对许多不同的值进行分组,而必须指定要对其进行分组的确切方式。
你想买一个吗
SUM(ProductName)
或者LIST(ProductName
或者AVG(ProductName)
或者别的什么?你想怎么处理
ProductName
,您打算如何使用该列?您可以(使用函数式编程中的术语)将多个值折叠成一个值
或者您应该将其指定为锚定,将一个组与其他组分开。
在进行聚合时,查询的每一列都必须
每个组值都是唯一的,告诉相邻组中的一个组(然后应该在GROUPBY子句中列出)
或者由您选择的聚合函数通过每个值组进行聚合(然后您应该指定要使用的函数)
另一个问题是使用
ProductName
作为一个关键领域。这通常是个坏主意,原因很多(至少三个)。通常,您需要一个整数数字id和一个单独的表,其中包含产品的每个合成id的名称和其他属性。
另请参见:
代理密钥与自然/业务密钥
https://www.databasejournal.com/features/mssql/article.php/3922066
http://www.dbasupport.com/forums/showthread.php?47953-natural-vs-synthetic-keys
qnakjoqk2#
避免将普通列与派生列的聚合函数混合使用。对于测试,您可以使用:
fbcarpbf3#
您的查询将在mysql(旧版本)或sqlite中工作。但您不需要聚合查询。在这种情况下,
ORDER BY
以及LIMIT
你想要什么:你的老师应该知道这一点,不应该教坏语法。它不是sql标准,在大多数数据库中都不起作用。
你的语法被破坏了,因为
GROUP BY
以及SELECT
子句不兼容--在SELECT
(我认为其他答案可以解释这一点)。gg58donl4#
很明显你和你的老师有不同的设置或者不同版本的数据库程序。如果是我的sql。mysql只提供了一个设置\u full \u group \u,您可以在https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html 如何满足你的需要。如果您无法更改设置,则可能无法解决此问题。