考虑以下电影数据库:
我想回答以下问题:
找出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年前后平均值的差异?
答案 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 ...