2010-09-12 60 views
1

前幾天我問過類似的問題,這是我的問題。我的教授解釋了以下問題:找出每個劇院中所有電影的平均收視率。顯示劇院名稱和計算出的評分。按等級升序排列結果。對SQL查詢的後續幫助

這裏是我的表是如何構成的:

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

用途:

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

你缺少GROUP BY

您無法通過這些非聚集列在選擇列表非聚合列引用混合聚集表達式(你的情況Theatres.Name),除非你組。

+0

即使與(我的例子中瞭解到,我一直在關注你的過去例如)我仍然得到一個「SQL命令沒有正確結束」 – 2010-09-12 00:31:31

+0

你用分號結束它? 「GROUP BY」和「ORDER BY」是否正確? – 2010-09-12 00:34:19

1

當你在synax中有一個不適當的子句時,出現「SQL命令未正確結束」。就像在CREATE VIEW中不能有ORDER BY一樣。如果你不選擇AVG(COL1),COL2 FROM ........ GROUP BY COL2 ORDER BY 然後我不明白你爲什麼會得到這個ORA異常。

粘貼您最後一個生成該異常的查詢,並讓我知道您是否在存儲過程,函數或視圖中使用它。

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) 

你不需要電影表,因爲你不;噸需要任何列從它

+1

你不需要MOVIES表嗎?你從哪裏獲得評分? ;) – 2010-09-12 01:34:39

+0

不,你說得對!我讀了一個東西並輸入另一個東西,你不需要'theatres'表(因爲劇院名稱在關聯表(ShowAt)中) – 2010-09-12 16:26:19