Среднее из суммы минус минимум - PullRequest
4 голосов
/ 02 декабря 2010

Привет, ребята, у меня есть оператор 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.  

Ответы [ 3 ]

3 голосов
/ 02 декабря 2010

Посмотрите на аналитические функции.( 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.

1 голос
/ 02 декабря 2010

Если вам нужно отбросить только одну низшую оценку (в случае галстуков)

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
0 голосов
/ 02 декабря 2010

Оператор сумм дает один результат (на группу).Мин-оператор тоже.Так над чем должен агрегировать avg-оператор?

...