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 Error: 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)

列が必要ないため、movies テーブルは必要ありません。

于 2010-09-12T01:04:17.003 に答える