Расчет средних оценок с использованием различных шкал в MySQL - PullRequest
0 голосов
/ 12 мая 2011

Я хочу рассчитать среднюю оценку группы строк в таблице MySQL.Дело в том, что может использоваться разная шкала, в зависимости от того, каким пользователем вы вошли.

Примером шкал может быть:

  • 1-5
  • 1-10
  • AF (за исключением E, очевидно)

В числовых масштабах более высокое число лучше, но в алфавитном масштабе лучше.

Как мне сделать SQL-запрос для получения правильного среднего?

Пример средних:

  • 5, 5, 4, 2 = 4
  • 8, 10, 7, 6, 4 = 7
  • A, A, C = B
  • A, F, B, B = C
  • F, F, B, D = D

Используемый мной запрос:

SELECT CHAR(ROUND(AVG(ORD(UPPER(grade))))) AS average

Проблема здесь - последний пример.Получается, что E использует этот запрос, но это недопустимая оценка, это должно быть D.

Я не знаю, как с этим справиться.Каков наилучший способ получить среднюю оценку в MySQL, если шкала имеет исключенные значения (например, шкала AF исключает E)?Я мог бы вычислить его в PHP, если нужно также

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Без создания SQL-запроса, который выглядит как спагетти, лучший способ сделать это - создать таблицу сопоставления со значениями баллов -> баллов.

Например,

Table Values
grade  value
    A | 4
    B | 3
    C | 2
    etc.

Затем вы получите среднее значение

SELECT ROUND(AVG(v.value)) FROM Grades g 
           INNER JOIN Values v on g.grade = v.grade

И после этого вы можете присоединиться к таблице, чтобы получить результат

SELECT * FROM (
     SELECT ROUND(AVG(grade)) avg FROM Grades g 
               INNER JOIN Values v on g.value = v.value
             ) avgs 
INNER JOIN Values v2 on avgs.avg = v2.values
1 голос
/ 12 мая 2011

Создайте еще одну таблицу с отображением между буквой и значением, объединитесь с ней один раз, чтобы получить значения для текущих букв, и соединитесь с ней еще раз, чтобы преобразовать среднее значение обратно в букву.

...