Последующая помощь с запросом SQL - PullRequest
1 голос
/ 12 сентября 2010

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

Вот как структурированы мои таблицы:

CREATE TABLE Theatres (
  Name varchar2(50) not null,
  City varchar2(50) not null,
  State varchar2(50) not null,
  Zip number not null,
  Phone varchar2(50) not null,
  PRIMARY KEY (Name)
);

CREATE TABLE Movies (
 Title varchar2(100) not null,
 Rating NUMBER not null,
 Length NUMBER not null,
 ReleaseDate date not null,
 PRIMARY KEY (Title),
 CHECK (Rating BETWEEN 0 AND 10),
 CHECK (Length > 0),
 CHECK (ReleaseDate > to_date('1/January/1900', 'DD/MONTH/YYYY'))
);

CREATE TABLE ShownAt (
  TheatreName varchar2(50) not null,
  MovieTitle varchar2(100) not null,
 PRIMARY KEY (TheatreName, MovieTitle),
  FOREIGN KEY (TheatreName) REFERENCES Theatres(Name),
  FOREIGN KEY (MovieTitle) REFERENCES Movies(Title)
);

SELECT 
 AVG(Movies.Rating), 
 Theatres.Name
 FROM Theatres
 JOIN ShownAt ON ShownAt.TheatreName = Theatres.Name
 JOIN Movies ON ShownAt.MovieTitle = Movies.Title
 ORDER BY Movies.Rating ASC

Видите что-нибудь необычное? Я продолжаю получать сообщение об ошибке SQL: ORA-00937: не групповая функция одной группы 00937. 00000 - «не групповая функция одной группы» Прости мою новичок.

Ответы [ 4 ]

4 голосов
/ 12 сентября 2010

Использование:

  SELECT AVG(m.rating) AS avg_rating, 
         t.name
    FROM THEATRES t
    JOIN SHOWNAT sa ON sa.theatrename = t.name
    JOIN MOVIES m ON m.title = sa.movietitle
GROUP BY t.name
ORDER BY avg_rating

GROUP BY должен включать все столбцы, на которые нет ссылок внутри агрегатных функций (IE: MAX, MIN, AVG, COUNT и т. Д.).

2 голосов
/ 12 сентября 2010

Вам не хватает GROUP BY

Вы не можете смешивать агрегированные выражения в списке выбора с неагрегированными ссылками на столбцы (в вашем случае Theatres.Name), если не группируете по этим неагрегированным столбцам.

1 голос
/ 12 сентября 2010

Попробуйте это:

Select s.TheatreName Theatre, 
     Avg(m.rating) AvgRating  
From Movies m 
   left Join ShowAt s
     On s.movieTitle = m.Title
Group By s.TheatreName 
order By Avg(m.rating)

Вам не нужен стол с фильмами, так как вам не нужны столбцы из него

1 голос
/ 12 сентября 2010

«Команда SQL не завершена должным образом» появляется, когда в synax есть неуместное предложение ... как будто у вас не может быть ORDER BY в CREATE VIEW.

Так что, если у вас нет ВЫБЕРИТЕ AVG (COL1), COL2 ОТ ........ GROUP BY COL2 ЗАКАЗАТЬ что-нибудь Тогда я не понимаю, почему вы получаете это исключение ORA.

Вставьте ваш последний запрос, который сгенерировал это исключение, а также дайте мне знать, если вы используете его в хранимой процедуре, функции или представлении.

...