Среднее SQL группировки

Я стараюсь получить средние баллы наших студентов по задачам ответственности и сотрудничества. Проблема в том, что задачи «ответственность» и «сотрудничество» могут называться по-разному-например, «сотрудничество в музыке» и «сотрудничество в математике», но они по-прежнему имеют либо «ответственность», либо «сотрудничество» в своих названиях. Поэтому при выполнении запроса ниже я получаю несколько результатов для задач, связанных с совместной работой, и несколько результатов для задач ответственности. Мне нужен один средний для ответственности и один для сотрудничества. Есть предложения? У меня есть SQL Server.

SELECT gradingscores.task AS task, 
       avg(Cast(gradingscores.score AS decimal) as averages 
FROM gradingscores 
WHERE    isnumeric(gradingscores.score) = 1
  AND    task LIKE %responsibility% 
   OR    task LIKE %collaboration%

Таким образом, мои результаты выглядят как:

Средние Задачи
Ответственность в музыке 4.0
Ответственность в математике 3.5
Ответственность N английский 3.0
Сотрудничество в музыке 3.5
Сотрудничество в области искусства 2.5

Я хотел бы, чтобы мои результаты выглядели как:

Средние Задачи
Ответственность 4.0
Сотрудничество 3.5

Оценочные баллы также находятся в varchar и должны быть преобразованы в цифры, дисконтируя любые нечисловые данные.

2 ответа

  1. Вы должны иметь возможность группировать по первым 14 буквам задачи, с rtrim, чтобы избавиться от дополнительного пространства на совместной работе (13 букв )

    «Где» будет убедиться, что это только собирается получить записи, которые являются совместной работы или ответственности.

    SELECT   RTRIM(LEFT(gradingscores.task, 14) AS task, 
             cast(avg(Cast(gradingscores.score AS decimal(10,1)) as decimal(10,1)) as averages 
    FROM     gradingscores 
    WHERE    isnumeric(gradingscores.score) = 1
      AND    task LIKE 'responsibility%' 
       OR    task LIKE 'collaboration%'
    GROUP BY RTRIM(LEFT(gradingscores.task, 14)
    
  2. Я понял, что мне просто нужно удалить имя задачи из инструкции Select и выполнить отдельные запросы для оценок ответственности и совместной работы. Таким образом, он автоматически группирует все задачи, которые имеют ответственность или сотрудничество в них.

    SELECT avg(Cast(gradingscores.score AS decimal) as averages 
    FROM gradingscores 
    WHERE    isnumeric(gradingscores.score) = 1
             AND task LIKE %responsibility%