2

学生のGPAを計算して一覧表示し、すべての学生の平均GPAを下回るものだけを表示するクエリを作成しようとしています。各生徒のGPAを含むテーブルを出力するクエリを正常に取得しましたが、平均を下回るものだけを表示するように取得することはできません。

以下は私の現在のクエリです。

    SELECT SC.StudentID, S.StdLastName, GPA
    FROM (SELECT SC.StudentID, S.StdLastName, ROUND(SUM(C.Credits * GV.GradeValue)/SUM(C.Credits), 2) AS GPA
         FROM ((Student_Classes AS SC INNER JOIN GradeValues AS GV ON SC.Grade = GV.Grade) 
         INNER JOIN Students AS S ON SC.StudentID = S.StudentID)
         INNER JOIN Classes as C ON SC.ClassID = C.ClassID
         GROUP BY SC.StudentID, S.StdLastName)
    GROUP BY SC.StudentID, S.StdLastName, GPA
    HAVING GPA < AVG(GPA)
    ORDER BY GPA;

これを行うと、表示されるエラーは次のとおりです。

集計関数の一部として、指定された式GPA <AVG(GPA)を含まないクエリを実行しようとしました。

このサイトで同様のエラーに関する複数のページを見つけましたが、それでも機能させることができませんでした。どんな助けでも大歓迎です。

4

2 に答える 2

3

と言うときGROUP BY SC.StudentID, S.StdLastName, GPA、これらの 3 つの列を使用してデータのグループを作成し、各グループに集計関数 (この場合はAVG) を適用するようにデータベースに指示しています。つまり、書かれているように、各学生の GPA をその学生の平均に対してフィルタリングしようとしているということです。願わくば、各学生の平均 GPA が実際の G​​PA と等しくなるように...

これを機能させるには、全体の平均 GPA を取得するために使用できる 2 番目のサブクエリが必要です。

SELECT sc.studentid, s.stdlastname, gpa
FROM   (SELECT sc.studentid, 
               s.stdlastname, 
               ROUND(SUM(c.credits * gv.gradevalue) / SUM(c.credits), 2) AS gpa
        FROM      ((student_classes sc
              INNER JOIN gradevalues gv
                 ON sc.grade = gv.grade)
              INNER JOIN students s
                 ON sc.studentid = s.studentid)
        GROUP BY sc.studentid, s.stdlastname)
GROUP BY sc.studentid, s.stdlastname, gpa
WHERE gpa < (SELECT AVG(GPA) as avg_gpa 
               FROM (SELECT ROUND(SUM(c.credits * gv.gradevalue) / SUM(c.credits), 2) AS gpa
                     FROM  student_classes sc
                           INNER JOIN gradevalues gv
                                   ON sc.grade = gv.grade
                     GROUP BY sc.studentid))
ORDER BY gpa;

これで構文上の問題が解決するかどうかはわかりませんが、論理的な問題は解決するはずです。

于 2013-03-04T21:15:33.273 に答える
0

これでエラーは解消されますか? 存在する場合は、ここから sid、lname、および GPA を選択するだけです。

  SELECT SC.StudentID, S.StdLastName, GPA, avg(GPA) as avgGPA
FROM (SELECT SC.StudentID, S.StdLastName, ROUND(SUM(C.Credits * GV.GradeValue)/SUM(C.Credits), 2) AS GPA
     FROM ((Student_Classes AS SC INNER JOIN GradeValues AS GV ON SC.Grade = GV.Grade) 
     INNER JOIN Students AS S ON SC.StudentID = S.StudentID)
     INNER JOIN Classes as C ON SC.ClassID = C.ClassID
     GROUP BY SC.StudentID, S.StdLastName)
WHERE GPA < avg(GPA)
GROUP BY SC.StudentID, S.StdLastName, GPA
    ORDER BY GPA;
于 2013-03-04T19:56:22.280 に答える