Вложенная агрегатная функция SQL AVG с оператором Join - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть две таблицы, первая таблица называется Movies, вторая таблица называется Reviews примерно так:

Table Movies: [ MovieID / MovieName / MovieYear] 

Table Reviews: [ReviewID / MovieID / userID / Rating / ReviewDate]

где столбцы разделены /

Я пытаюсь выполнить запрос, который объединит обе таблицы с выводом MovieID, MovieName, MovieYear, количества отзывов и среднего рейтинга , и я получил запрос, пока не получил к средней части рейтинга. Я получаю сообщение об ошибке в Azure Studio:

"Невозможно выполнить статистическую функцию для выражения, содержащего агрегат или подзапрос. «

И мое замешательство заключается в том, что с помощью функции усреднения предполагается, что она вычисляет среднее значение для отдельного фильма, но я также не хотел делать два запроса, когда в первом запросе я просто опускаю средний бит, получаю оценку для каждый и затем во втором запросе затем вычисляют среднее значение; Мне было интересно, если есть способ сделать все это в одном запросе. Ниже мой запрос, который я имею до сих пор:

SELECT 
  Movies.MovieID, 
  Movies.MovieName,
  COUNT(Reviews.MovieID) AS NumReviews, 
  AVG(CONVERT(float, COUNT(Rating) )) AS  AvgRating 
FROM 
  Movies 
  JOIN Reviews ON(Reviews.MovieID = Movies.MovieID)
GROUP BY 
  Movies.MovieID, 
  Movies.MovieName

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Сначала вам нужно явно указать COUNT(RATING), потому что Error говорит действительно ясно .. Агрегат не может содержать в себе другого выражения агрегирования ..

SELECT 
  MovieID, 
  MovieName,
  NumReviews, 
  AVG(CONVERT(float, CountRating)) AS AvgRating 
FROM 
 (SELECT 
    Movies.MovieID, 
    Movies.MovieName, 
    Count(Reviews.MovieID) as NumReviews
    Count(Reviews.Rating) as CountRating
  FROM
    Movies
    INNER JOIN Reviews ON (Reviews.MovieID = Movies.MovieID)
  GROUP BY
    Movies.MovieID,
    Movies.MovieName) As Derived_Table
0 голосов
/ 19 ноября 2018

Это то, что вы хотите?

SELECT m.MovieID, m.MovieName,
       COUNT(*) AS NumReviews, 
       AVG(CONVERT(float, r.Rating)) AS AvgRating 
FROM Movies m JOIN
     Reviews r
     ON r.MovieID = m.MovieID
GROUP BY m.MovieID, m.MovieName;

Это вычисляет среднюю оценку, которая кажется наиболее разумной оценкой для оценок.

0 голосов
/ 19 ноября 2018

есть причина, по которой вы написали это как AVG(COUNT(Rating))? если вы хотите средний рейтинг, просто используйте AVG(Rating)

...