【问题标题】:SQL Query AveragesSQL 查询平均值
【发布时间】:2013-11-02 11:01:08
【问题描述】:

考虑以下电影数据库:

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

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

【问题讨论】:

  • 您的查询结果是每年每部电影的平均评分(假设您的 JOIN 正确)。
  • 您可以使用某种 case 语句来推导 1980 年之前/之后,并按此进行分组。

标签: sql


【解决方案1】:

不要认为使用 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 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多