MYSQL SUM 语法

3
如果我想知道电影名称和其销售总额,我可以使用以下查询吗?
Movie.Name, Movie.Sales, 
FROM Movie 
GROUP BY Movie.Name 
HAVING SUM (Movie.Sales)>120000 
ORDER BY SUM(Movie.Sales)DESC;

我知道最好的写作方式是

Movie.Name, Movie.Sales, 
FROM Movie 
GROUP BY Movie.Name 
HAVING Movie.Sales>120000 
ORDER BY Movie.Sales DESC;

我只是想知道第一个答案在测试中是否仍然被认为是好的。顺便说一下,这两个查询都会给出相同的结果,但由于Movie.Sales已经有了总数,因此不需要使用SUM。您认为这是一个不好的答案吗?


"因为电影销售额已经有了总数。" 不是的,它只有单行的销售额,而不是所有行的总和。 - Barmar
2个回答

0
你必须记住,order by 总是适用于可见的列,在你的情况下是第一个 select。
select  Movie.Name, Movie.Sales, 
FROM Movie
GROUP BY Movie.Name HAVING SUM (Movie.Sales)>12000 0 
ORDER BY SUM(Movie.Sales)DESC;

包含两个错误...在FROM子句之前有一个错误的,,以及对未显示列进行排序

第二个是正确的


谢谢您先生!非常感激。 - coder_1432

0
不,第一个查询将无法工作,因为它存在错误。您正在对Movie.Name字段进行GROUP BY,但尝试在查询中包含未分组的字段而没有聚合函数。无论您想在哪里使用Movie.Sales字段,都必须与SUM()函数一起使用。
SELECT Movie.Name, SUM(Movie.Sales) Sales
FROM Movie
GROUP BY Movie.Name
HAVING SUM(Movie.Sales)>120000
ORDER BY SUM(Movie.Sales) DESC

以上是您第一个查询的更正版本,但您的第二个查询肯定是正确的,而且在表已经聚合的情况下可能是最佳实践。

非常感谢您先生。第一个查询在我尝试在phpmyadmin中运行时有效,并显示了正确的结果。您有任何想法为什么吗? - coder_1432
在MySQL中,它实际上不会返回错误,但会给出不可预测的结果。在你的查询中,它可能只返回看起来正确的结果,因为你的表已经聚合过了,所以实际上没有进行聚合操作。然而,其他数据库系统会对这个查询返回错误。 - shamsup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接