嗨!我是SQL的新手,我无法正确使用avg和sum函数。我正在使用上面的数据库。我需要找到每个影星的平均利润,但只有当他们的利润总和> 1时才输出平均值。 200.
SELECT MovieStar.sname, avg(profit) From MovieStar, Movie
GROUP BY sname
HAVING sum(Movie.profit) > 200
我正在使用SQL Fiddle尝试解决这个问题,但它似乎正在回归整个利润列的平均而不是每个演员,但我不确定我可能做错了什么。我怎样才能接近这一点,这样我就可以得到每个演员的平均而不是整个利润列的平均值? Here是我做的SQL小提琴。提前谢谢!
答案 0 :(得分:3)
看起来查询正在执行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