SQL的分组平均数
嗨!我是SQL新手我无法正确使用avg和sum函数。我正在处理上面的数据库。我需要找到的平均利润为每个影星,但只只输出平均,如果他们的利润总和为> 200
SELECT MovieStar.sname, avg(profit) From MovieStar, Movie
GROUP BY sname
HAVING sum(Movie.profit) > 200
我使用SQL小提琴,试图弄清楚这一点,但它似乎要返回整个利润列的平均值,而不是每个演员,但我不知道我会做错什么。我该如何解决这个问题,以便我可以得到每个演员的平均值,而不是整个利润列的平均值? Here是我提出的SQL小提琴。提前致谢!
看起来像查询正在进行CROSS JOIN操作,一个笛卡尔产品,将每部电影匹配到每个电影明星。似乎我们只想将电影明星匹配到特定的电影,可能使用(包括)starsin
表格来获得匹配。
我建议你把旧的逗号运算符连接起来。改为使用更新的JOIN关键字。并将连接谓词放在适当的ON子句中而不是WHERE子句中。
此外,最佳实践是限定全部列引用;即使不需要消除歧义,它也可以防止在添加新列时查询中断,并且有助于未来的读者......可怜的灵魂必须查看表定义来确定哪些柱来自哪个表。
我想你想是这样的:
SELECT ms.sname
-- , ms.sno
, AVG(m.profit) AS avg_profit
-- , SUM(m.profit) AS tot_profit
FROM MovieStar ms
JOIN StarsIn si
ON si.sno = ms.sno
JOIN Movie m
ON m.mno = si.mno
GROUP BY ms.sno, ms.sname
HAVING SUM(m.profit) > 200
ORDER BY AVG(m.profit) DESC
事实上,这正是为什么隐式连接要避免,因为你可以[错误地运行交叉连接](https://*.com/a/317465/1422451)与OP一样。 – Parfait
谢谢你们两位!我不知道交叉连接操作可能会发生,但这是有道理的。在这种情况下,我可以问你为什么选择使用ON而不是WHERE吗?在我看来,他们看起来是一样的,至少是密切相关的。 – helloworld
我宁愿将行“匹配”的条件放入ON子句中,并将其他条件放入WHERE子句中。这不是要求,MySQL不关心。这只是一种风格习惯,一种偏好。我认为当查询连接八个表时,读者会更容易在ON子句中获得条件,而不是让读者筛选WHERE子句中的所有条件。在ON子句中具有条件也使得我们在执行OUTER JOIN时更容易。 – spencer7593
你应该演员组吗?如果您只是使用运行平均值,请查看窗口函数。 –
是不是'GROUP BY sname'所做的?按名称分组? – helloworld
您没有连接条件,也没有实际的现代JOIN;所以每个明星都会与每部**电影配对。 – Uueerdo