1

以下を含むビューを作成しました。

 student_full_name    subject_code    result
 Jennifer Higgins     CS1234          81
 Jennifer Higgins     CS1235          90
 Kal Penn             CS1234          70
 Kal Penn             CS1235          60
 Han Solo             CS1234          45
 Han Solo             CS1235          70

私は取得しようとしています:

  1. Jennifer Higgins が CS1234 と CS1235 に登録したとします。彼女の平均点は 85.50 です。

  2. 次に、Jennifer Higgins の点数をすべての登録者の平均点と比較して、すべての科目の AVG(結果) を合計します。

  3. クエリは、平均点を上回っているすべての学生を一覧表示します。

すべての結果の AVG を取得するには、ここでサブクエリを使用する必要があることを知っています。これは一種の疑似コードです。サブクエリ自体をクエリの結果と比較する方法がわからないため、かなり行き詰まっています。1 つは Student_full_name によるグループ化用で、もう 1 つはすべての平均結果を取得するための 2 つの group by ステートメントが必要です。

 SELECT student_full_name,
        AVG(results) AS average_result
 FROM viewEnrol
 WHERE average_result > ( SELECT (AVG(results))
                          FROM viewEnrol

 GROUP BY student_full_name

//編集

OUTPUT は次のようになります。カル・ペンとハン・ソロは、平均点を上回っていないためリストに含まれていません。全教科の平均点は 69.33 点です。ハン・ソロは57.5点、カル・ペンは65点。

 student_full_name    subject_code    result
 Jennifer Higgins     CS1234          85.5

何か助けはありますか?

4

5 に答える 5

4

集計後に結果をフィルタリングする場合( など)、ではなくavgを使用する必要があります。havingwhere

一般的な規則は次のとおりです。

  • where集計が行われる前に、実際のデータベースから取得した生の (集計されていない) 行をフィルタリングします。と
  • having最終的に配信される (場合によっては集約された) 行をフィルタリングします。

次のようなもの(テストされていませんが):

SELECT   student_full_name,
         AVG (results) AS average_result
FROM     viewEnrol
GROUP BY student_full_name
HAVING   AVG (results) > ( SELECT AVG (results) FROM viewEnrol )
于 2012-05-31T05:29:23.823 に答える
4

これでうまくいくはずです。最初の内部クエリでは、すべての学生の平均の結果が得られます。2番目はテーブルの平均を示します。

    SELECT student_full_name 
    FROM (SELECT student_full_name,
                 AVG(results) AS average_Sresult
          FROM viewEnrol
          GROUP BY student_full_name) sre, 
         (SELECT (AVG(results)) tavg
          FROM viewEnrol) ta
     WHERE sre.average_Sresult > ta.tavg

PS: すべての結果の平均を取るのではなく、平均の平均を取るべきではありません。

于 2012-05-31T05:34:21.023 に答える
0

平均結果の取得はフィルタリングの問題であるため、グローバル平均を計算するときに外側のクエリを参照する必要はありません。あなたの疑似コードは、必要なものに非常に近いものです。where句をhaving句に変換したいと思うでしょう。また、平均以上の成績を収めている学生ではなく、平均以上の学生を比較したようです。平均の定義が何であるかが完全に明確であることを確認してください。

このフォームの何か:

select student_full_name, avg(results) as avg_result
from viewEnrol
group by student_full_name
having avg(results) > (
    select avg(avg_results)
    from (
        select name, avg(results) as avg_results
        group by student_full_name
        )
    )
于 2012-05-31T05:34:39.997 に答える
0

すべての問題を解決策として、表を作成しました

CREATE TABLE STUD
(SNAME varchar(20),
 SCODE NUMBER    PRIMARY KEY,
 MARKS NUMBER(4,2))

挿入された値

SNAME   SCODE   MARKS
--------------------
SAM     1001    90
VAS     1001    80
SAM     1002    60
ANAND   1001    80
VAS     1002    70
ANAND   1002    50

クエリは

SELECT SNAME,AVG(MARKS) FROM STUD GROUP BY SNAME HAVING AVG(MARKS)>=
(SELECT MAX(MARKS ) FROM STUD WHERE SNAME='VAS')
于 2012-05-31T05:58:31.217 に答える