Замените буквы произвольными числами в статистической функции SQL - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть таблица, которая выглядит следующим образом:

+----+-----------+-------+
| id |  subject  | grade |
+----+-----------+-------+
|  1 | english   | 2     |
|  1 | math      | 3     |
|  1 | physics   | 1     |
|  1 | chemistry | 1     |
|  1 | biology   | *     |
|  2 | english   | 1     |
+----+-----------+-------+

Я хотел бы запустить

AVG(grade) OVER (PARTITION BY id ORDER BY id DESC) AS 'Average Grade'

Но, конечно, не будет работать, поскольку есть оценки, которые *, A, B и т. Д.

Есть ли способ, с помощью которого я могу сказать AVG заменять буквы произвольными значениями при вычислении, например

*.* = 0

*.A = 1

*.B = 2

И игнорировать такие поля, как N / A или X.

Заранее спасибо

РЕДАКТИРОВАТЬ:

Моя СУБД Sql Server

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы можете использовать гигантское выражение 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() может быть истинной справочной таблицей.

0 голосов
/ 24 сентября 2018

Вы можете попытаться использовать CASE WHEN в функции AVG.

AVG(CASE WHEN grade = '*' THEN 0 
     WHEN grade = 'A' THEN 1 
     WHEN grade = 'B' THEN 2 
     ....
    ELSE grade END) OVER (PARTITION BY id ORDER BY id DESC) AS 'Average Grade'

ПРИМЕЧАНИЕ

Я бы посоветовал вам позволить grade быть int dataTypeвместо строки, потому что это может быть легче вычислить.

...