2

考虑以下电影数据库:

在此处输入图像描述

我正在尝试回答以下问题:

找出 1980 年之前发行的电影的平均评分与 1980 年之后发行的电影的平均评分之间的差异。(确保计算每部电影的平均评分,然后计算 1980 年之前和之后电影的平均值。不要t 只计算 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 年前后平均值的差异?

4

1 回答 1

0

不要认为使用 case 语句有任何问题。

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,平均值不将null计入值的总数(null毕竟不是0)。

编辑:您正在寻找对问题的单行回复,对吗?摆脱您选择和分组中的 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 ...
于 2013-10-23T23:37:32.010 回答