Sql 看起来很容易,但由于某种原因,我看不出有多少诡计。我仍然得到0.0的结果。最初,在练习中建议“确保计算每部电影的平均评分,然后计算1980年之前和之后电影的平均评分。不要只计算1980年之前和之后的总体平均评分。”@ThorstenKettener我收到以

Sql 看起来很容易,但由于某种原因,我看不出有多少诡计。我仍然得到0.0的结果。最初,在练习中建议“确保计算每部电影的平均评分,然后计算1980年之前和之后电影的平均评分。不要只计算1980年之前和之后的总体平均评分。”@ThorstenKettener我收到以,sql,sqlite,Sql,Sqlite,看起来很容易,但由于某种原因,我看不出有多少诡计。我仍然得到0.0的结果。最初,在练习中建议“确保计算每部电影的平均评分,然后计算1980年之前和之后电影的平均评分。不要只计算1980年之前和之后的总体平均评分。”@ThorstenKettener我收到以下错误:查询无法执行:near”(':syntax errorOops,我错过了FROM关键字。添加了它。@ThrostenKettner恭喜!!成功完成了!我得到了正确的结果!非常感谢!这对我来说很棘手!我应该更多地学习如何使用别名,比如你对


看起来很容易,但由于某种原因,我看不出有多少诡计。我仍然得到0.0的结果。最初,在练习中建议“确保计算每部电影的平均评分,然后计算1980年之前和之后电影的平均评分。不要只计算1980年之前和之后的总体平均评分。”@ThorstenKettener我收到以下错误:查询无法执行:near”(':syntax errorOops,我错过了FROM关键字。添加了它。@ThrostenKettner恭喜!!成功完成了!我得到了正确的结果!非常感谢!这对我来说很棘手!我应该更多地学习如何使用别名,比如你对r的定义。@ThrostenKettner为什么需要创建中间列?我没有创建任何东西。这很明显在两个表中都显示电影ID。在原始查询中也使用它。
SELECT AVG(avgB) - AVG(avgA)
FROM(
SELECT AVG(stars) as avgB
FROM Rating
JOIN Movie
ON Rating.mID = Movie.mID 
GROUP BY title
HAVING year < 1980
UNION
SELECT AVG(stars) as avgA
FROM Rating
JOIN Movie
ON Rating.mID = Movie.mID 
GROUP BY title
HAVING year > 1980
);
SELECT AVG(avgB) - AVG(avgA)
  FROM(
       SELECT AVG(stars) as avgB
         FROM Rating
         JOIN Movie
         ON Rating.mID = Movie.mID 
        WHERE Movie.year < 1980
       GROUP BY title
      UNION
       SELECT AVG(stars) as avgA
         FROM Rating
         JOIN Movie
         ON Rating.mID = Movie.mID 
        WHERE Movie.year >= 1980
       GROUP BY title
      );
SELECT (AVG(B.Rating_OLD) - AVG(B.Rating_NEW)) AS Rating_Diff
  FROM (
        SELECT A.title , AVG(A.stars_OLD) AS Rating_OLD ,AVG(A.stars_NEW) AS Rating_NEW
          FROM (
                SELECT title                                    , 
                       CASE 
                          WHEN Movie.year <  1980 THEN Rating.stars
                          ELSE                         0
                       END AS stars_OLD                         ,
                       CASE 
                          WHEN Movie.year >= 1980 THEN Rating.stars
                          ELSE                         0
                       END AS stars_NEW                         
                  FROM Rating
                  JOIN Movie
                   ON Rating.mID = Movie.mID
               ) A
         GROUP BY A.title 
       ) B
SELECT 
    (AVG(CASE WHEN year < 1980 THEN stars ELSE 0 END)-
    AVG(CASE WHEN year >= 1980 THEN stars ELSE 0 END)) AS averag
FROM Rating
JOIN Movie ON Rating.mID = Movie.mID
SELECT 
    AVG(avgB) - AVG(avgA)
FROM
(
    (
        SELECT
            AVG(stars) as avgB
        FROM 
            Rating
        JOIN 
            Movie
        ON 
            Rating.mID = Movie.mID 
        WHERE 
            year < 1980
    ) t1
    CROSS JOIN
    (
        SELECT
            AVG(stars) as avgA
        FROM 
            Rating
        JOIN 
            Movie
        ON 
            Rating.mID = Movie.mID 
        WHERE 
            year < 1980
    ) t2
);
SELECT (AVG(CASE WHEN m.year < 1980 THEN r.stars END) -
        AVG(CASE WHEN m.year >= 1980 THEN r.stars END)
       ) AS averag
FROM Rating r JOIN
     Movie m
     ON r.mID = m.mID;
select
  avg(r.stars) as total,
  avg(case when m.year < 1980 then r.stars end) as pre1980,
  avg(case when m.year > 1980 then r.stars end) as post1980,
  avg(case when m.year < 1980 then r.stars end) -
  avg(case when m.year > 1980 then r.stars end) as diff
from
(
  select mid, avg(stars) as stars
  from rating
  group by mid
) r
join movie m on m.mid = r.mid;