我几天前问过类似的问题,这是我的问题。我的教授提出了以下问题:找出每个剧院播放的所有电影的平均评分。显示影院名称和计算的评级。按评级对结果进行排序。
以下是我的表格结构:
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 - “不是单组组功能”。原谅我的初学者。
答案 0 :(得分: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必须包含聚合函数内未引用的所有列(IE:MAX,MIN,AVG,COUNT等)。
答案 1 :(得分:2)
您错过了GROUP BY
您不能将选择列表中的聚合表达式与非聚合列引用(在您的情况下为Theatres.Name
)混合,除非您按这些非聚合列进行分组。
答案 2 :(得分:1)
所以,如果你没有SELECT AVG(COL1),COL2 FROM ........ GROUP BY COL2 ORDER by something 然后我不明白为什么你得到这个ORA例外。
粘贴生成该异常的最后一个查询,如果您在存储过程,函数或视图中使用它,也会告诉我。
答案 3 :(得分: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)
你不需要电影表,因为你不需要任何列