Вы можете использовать гигантское выражение case
как часть avg()
.Однако я бы посоветовал вам иметь справочную таблицу или хотя бы производную таблицу для обработки сопоставления:
Second (partition by id order by id)
не имеет смысла.Либо вы хотите получить полное среднее значение для id
(мое предположение), либо вы хотите получить среднее значение.Итак,
select avg(v.grade_val) over (partition by t.id) as id_average_grade
from t outer apply
(select
from (values ('A', 1), ('B', 2), ('*', 0), ('1', 1), ('2', 2), . . .
) v(grade, grade_val)
where v.grade = t.grade
) v(grade_val)
Обратите внимание, что внутренняя values()
может быть истинной справочной таблицей.