为什么我从下面的查询中只得到一个结果?建议的“答案”的名字是“Susan”,而不是我在结果中得到的名字。
SELECT EmpFirstName, EmpLastName, p.ProductName as ProductName,
YEAR(c.OrderDate) AS Year,
SUM(o.QuotedPrice + o.QuantityOrdered) AS TotalValue
FROM Employees
NATURAL JOIN Products p
NATURAL JOIN Order_Details o
NATURAL JOIN Orders c
ORDER BY Year, TotalValue DESC
结果图像
表结构的图像
3条答案
按热度按时间8xiog9wr1#
因为查询中有一个Sum
wtzytmuj2#
查询返回的结果与您的预期不符,因为查询无效。而且您的预期不正确。
SELECT
子句的表达式中存在aggregate (GROUP BY
) function需要存在GROUP BY
子句。如果不存在这样的子句,SQL标准会自动添加GROUP BY 1
子句,该子句将从所有选定行中仅生成一个组。出现在
GROUP BY
查询的SELECT
子句中的每个表达式都必须遵循以下规则之一,才能获得有效的SQL查询:1.它也出现在
GROUP BY
子句中;1.它是对aggregate (
GROUP BY
) function的调用1.在功能上依赖于
GROUP BY
子句中出现的一列。由于查询没有
GROUP BY
子句,因此SELECT
子句中的表达式EmpFirstName
、EmpLastName
、p.ProductName
和YEAR(c.OrderDate)
无效。在5.7.5之前的版本中,MySQL允许这样的无效SQL查询,但是它保留了return indeterminate values的特权来处理无效的表达式。
从5.7.5版本开始,MySQL可以正确地处理这些查询并拒绝它们,而其他RDBMS-es在很多年前就可以正确地处理它们。
对不确定值的解释很简单:
JOIN
和WHERE
子句从表中提取一些行(s)。GROUP BY
子句仅从所有这些行生成一条记录。GROUP BY
查询从不从表中返回行,它生成放入结果集中的值。由于组中EmpFirstName
有多个不同的值,SQL标准规定查询无效,MySQL过去常常忽略该标准,但它没有从SELECT
子句的EmpFirstName
表达式中选取什么值的有效规则,组中各行的任何值都是有效的,这就是它返回的值:从该组中选择一个随机值。为了得到预期的结果,您必须按
OrderNumber
和ProductNumber
对行进行分组(以及EmployeeID
以获得有效的SQL查询):9avjhtql3#
这里我遇到了"同样的问题",但是使用了count(),所以我将问题添加到子查询中,并且工作正常。请记住,将所有条件(包括where)放入子查询中,以便正常工作。请尝试以下操作:
sum()的变化-
您的代码:
我已经在您的代码中做了更改,并删除了TotalValue DESC,因为de reference不起作用(不知道为什么),但列将具有名称。
您忘记了order by前面的where子句
并且您还需要通知子查询中的where子句,不要忘记这一点!
希望对你有帮助
附注:
在子查询内部,您可以与子查询之前选择的所有属性进行比较(仅注意子查询之前的逗号-因为它是选择的最后一个元素)先看代码,我与子查询之前选择的M. Id进行比较)
我发现了些东西,也许能帮上忙:* * 之后按年份排序,**
这使得引用在where子句中,并且也适用于order by!