1

几天前我问过类似的问题,这是我的问题。我的教授提出了以下问题:找出每个影院播放的所有电影的平均收视率。显示剧院名称和计算的收视率。按等级升序排列结果。

以下是我的表格的结构:

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: not a single-group group function 00937. 00000 - “not a single-group group function”。原谅我的初学者。

4

4 回答 4

4

采用:

  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 必须包括聚合函数内部未引用的所有列(即:MAX、MIN、AVG、COUNT 等)。

于 2010-09-12T00:31:41.773 回答
2

你错过了GROUP BY

您不能将选择列表中的聚合表达式与非聚合列引用(在您的情况下Theatres.Name)混合,除非您按这些非聚合列分组。

于 2010-09-12T00:28:18.010 回答
1

当您在语法中有不适当的子句时会出现“SQL 命令未正确结束”。就像您不能在 CREATE VIEW 中使用 ORDER BY。

所以如果你没有 SELECT AVG(COL1),COL2 FROM ........ GROUP BY COL2 ORDER BY 那么我不明白你为什么会得到这个 ORA 异常。

粘贴生成该异常的最后一个查询,如果您在存储过程、函数或视图中使用它,请告诉我。

于 2010-09-12T00:42:12.357 回答
1

试试这个:

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)

您不需要电影表,因为您不需要其中的任何列

于 2010-09-12T01:04:17.003 回答