4

さまざまなアクティビティ タイプ (宿題、クイズなど) の成績を取得する SQL ステートメントがあります。エラーは、SQL コードと同様に以下のとおりです。

SELECT     Student.firstName, Student.lastName, 'Grades' =
           CASE 
              WHEN Grades.activityType = 'Homework' THEN
                CASE WHEN Policy.drop_hw = 1 THEN
                    (AVG(SUM(Grades.grade) - MIN(Grades.grade))) * (Policy.homework / 100)
                ELSE
                    (AVG(Grades.grade) * (Policy.homework / 100))
                END
            END,  Course.courseNum, Course.sectNum, Grades.activityType

FROM ...

ここに私が得ているエラーがあります:

- Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
- Column 'Policy.drop_hw' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.  
4

3 に答える 3

3

分析関数を調べます。(SOの質問Oracleのドキュメント)。

このようなもの:

AVG(Grades.grade) OVER (PARTITION BY Grades.student_id) AS avg_of_grades

と:

(AVG(SUM(Grades.grade) - MIN(Grades.grade))) OVER (PARTITION BY Grades.student_id) AS avg_grades_with_drop

あなたの場合に意味のあるものでパーティショニングを設定してください。例でを省略したため、わかりませんFROM ...

CASEその後、ステートメント内の任意の計算でこれらの列エイリアスを使用できます。

于 2010-12-02T19:13:25.073 に答える
1

最下位の成績を 1 つだけ落とす必要がある場合 (引き分けの場合)

SELECT  student_id, AVG(grade)
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY student_id ORDER BY grade) rn
        FROM    my_tables
        )
WHERE   NOT (drop_hw = 1 AND rn = 1)
GROUP BY
        student_id

最下位の成績をすべて落とす必要がある場合:

SELECT  student_id, AVG(grade)
FROM    (
        SELECT  *, MIN(grade) OVER (PARTITION BY student_id) mingrade
        FROM    my_tables
        )
WHERE   NOT (drop_hw = 1 AND grade = mingrade)
GROUP BY
        student_id
于 2010-12-02T18:59:23.487 に答える
0

sum-operator は、(グループごとに) 1 つの結果を返します。min-operator も。では、avg-operator は何を集約する必要があるのでしょうか?

于 2010-12-02T19:00:20.773 に答える