SQL分组平均值

时间:2017-10-17 23:56:37

标签: mysql sql database sum grouping

enter image description here

嗨!我是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小提琴。提前谢谢!

1 个答案:

答案 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
相关问题