2017-10-17 204 views
0

enter image description hereSQL的分组平均数

嗨!我是SQL新手我无法正确使用avg和sum函数。我正在处理上面的数据库。我需要找到的平均利润为每个影星,但只只输出平均,如果他们的利润总和为> 200

SELECT MovieStar.sname, avg(profit) From MovieStar, Movie 
GROUP BY sname 
HAVING sum(Movie.profit) > 200 

我使用SQL小提琴,试图弄清楚这一点,但它似乎要返回整个利润列的平均值,而不是每个演员,但我不知道我会做错什么。我该如何解决这个问题,以便我可以得到每个演员的平均值,而不是整个利润列的平均值? Here是我提出的SQL小提琴。提前致谢!

+0

你应该演员组吗?如果您只是使用运行平均值,请查看窗口函数。 –

+0

是不是'GROUP BY sname'所做的?按名称分组? – helloworld

+0

您没有连接条件,也没有实际的现代JOIN;所以每个明星都会与每部**电影配对。 – Uueerdo

回答

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 
+0

事实上,这正是为什么隐式连接要避免,因为你可以[错误地运行交叉连接](https://stackoverflow.com/a/317465/1422451)与OP一样。 – Parfait

+0

谢谢你们两位!我不知道交叉连接操作可能会发生,但这是有道理的。在这种情况下,我可以问你为什么选择使用ON而不是WHERE吗?在我看来,他们看起来是一样的,至少是密切相关的。 – helloworld

+0

我宁愿将行“匹配”的条件放入ON子句中,并将其他条件放入WHERE子句中。这不是要求,MySQL不关心。这只是一种风格习惯,一种偏好。我认为当查询连接八个表时,读者会更容易在ON子句中获得条件,而不是让读者筛选WHERE子句中的所有条件。在ON子句中具有条件也使得我们在执行OUTER JOIN时更容易。 – spencer7593