Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询平均值_Sql - Fatal编程技术网

SQL查询平均值

SQL查询平均值,sql,Sql,考虑以下电影数据库: 我试图回答以下问题: 找出1980年之前发行的电影的平均评级与1980年之后发行的电影的平均评级之间的差异。(一定要计算每部电影的平均收视率,然后是1980年之前和之后电影的平均收视率。不要只计算1980年之前和之后的总平均收视率。) 我写了以下内容: SELECT Movie.title, avg(Rating.stars), Movie.year FROM Movie INNER JOIN Rating ON Movie.mID = Rating.mID INNER

考虑以下电影数据库:

我试图回答以下问题:

找出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年前后的平均值差异?

不要认为使用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 ...
选择
平均值(1980年电影时的情况,然后评级为1980年后的平均值),
从…起
您可以从那里计算差异…这里的关键是在case语句中使用null,average不将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 ...
选择
平均值(1980年电影时的情况,然后评级为.stars,否则为空)为“差异”,
从…起

您的查询结果是每年每部电影的平均评级(假设您的联接是正确的)。您可以使用某种类型的case语句在1980年之前/之后进行推导,并根据该语句进行分组。