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

研究分析函数。(所以问题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

如果您只需要降低一个最低成绩(在平局的情况下)

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

和运算符给出一个结果(每组)。min-operator 也是。那么 avg-operator 应该聚合什么?

于 2010-12-02T19:00:20.773 回答