SQL查询平均值

时间:2013-10-23 23:15:02

标签: sql

考虑以下电影数据库:

enter image description here

我想回答以下问题:

  

找出1980年以前发行的电影的平均评分与1980年以后发行的电影的平均评分之间的差异。(确保计算每部电影的平均评分,然后计算1980年之前电影的平均评分和之后的电影不要只计算1980年之前和之后的总体平均评分。)

我写了以下内容:

SELECT Movie.title, avg(Rating.stars), Movie.year
FROM Movie 
INNER JOIN Rating ON Movie.mID = Rating.mID
INNER JOIN Reviewer ON Reviewer.rID = Rating.rID    
GROUP BY Rating.mID, Movie.year
ORDER BY year

这给出了每部电影的平均评分。我是否需要编写两个子查询来获得1980年前后平均值的差异?

1 个答案:

答案 0 :(得分:0)

不要认为使用案例陈述存在任何问题。

SELECT
avg(case when movie.year <= 1980 then Rating.stars else null end) as 'pre-1980 average', 
avg(case when movie.year > 1980 then Rating.stars else null end) as 'post-1980 average',
from ...

你可以从那里计算差异......这里的关键是在case语句中使用null,average对值的总数不计算null(null不是0 afterall)。

编辑:您正在寻找对该问题的一行回复吗?摆脱你的选择和分组中的movie.title和movie.year列。更接近于此:

SELECT
avg(case when movie.year <= 1980 then Rating.stars else null) - 
avg(case when movie.year > 1980 then Rating.stars else null) as 'difference',
from ...