【问题标题】:Average of Sum minus MinimumSum 的平均值减去最小值
【发布时间】:2011-05-19 07:54:56
【问题描述】:

我有一个 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.  

【问题讨论】:

    标签: sql oracle sql-function


    【解决方案1】:

    研究分析函数。 (SO question,Oracle documentation)。

    类似这样的:

    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 语句中的任何计算中使用这些列别名。

    【讨论】:

      【解决方案2】:

      如果你只需要降低一个最低分(以防平局)

      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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这是一个很好的观点。我没想到。没有总数时如何平均总和和最小值?
        • 你想做什么?我不明白你要计算什么。 SUM-MIN是什么意思?
        • 好吧,假设这些是等级:(100, 100, 100, 90)。如果班级的最低成绩下降,那么使用 sum - min tt'd be 390 - 90 这给了我 300,然后我找到该数字的平均值,但我不能这样做,因为它无法计算数字就像你说的那样,一件事又一件事。
        • 这个怎么样:SELECT AVG(value) FROM (SELECT SUM(Grades.grade)-MIN(Grades.grade) AS value FROM ...)
        猜你喜欢
        • 2022-01-12
        • 1970-01-01
        • 2014-10-10
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多