Я решаю задачу и мне удалось найти решение, но я не уверен, что это лучший способ написать этот запрос

SELECT 
    students.studentname,
    CASE 
        WHEN (AVG(courses_student.exam_season_one) +  
              AVG(courses_student.exam_season_two) + 
              AVG(courses_student.degree_season_one) + 
              AVG(courses_student.degree_season_two)) / 4 >= 80 
            THEN 'EXCELLENT'
        WHEN (AVG(courses_student.exam_season_one) +  
              AVG(courses_student.exam_season_two) + 
              AVG(courses_student.degree_season_one) + 
              AVG(courses_student.degree_season_two)) / 4 >= 70 
            THEN 'VERY GOOD'
        WHEN (AVG(courses_student.exam_season_one) +  
              AVG(courses_student.exam_season_two) + 
              AVG(courses_student.degree_season_one) + 
              AVG(courses_student.degree_season_two)) / 4 >= 60 
            THEN 'GOOD'
        WHEN (AVG(courses_student.exam_season_one) +  
              AVG(courses_student.exam_season_two) + 
              AVG(courses_student.degree_season_one) + 
              AVG(courses_student.degree_season_two)) / 4 >= 50 
            THEN 'ACCEPTABLE'
        ELSE 'FAIL'
    END AS GRADE
FROM
    courses_student
JOIN 
    students ON students.student_id = courses_student.student_id
GROUP BY 
    students.studentname

Как видите, я повторил это:

    WHEN (AVG(courses_student.exam_season_one) +  
          AVG(courses_student.exam_season_two) + 
          AVG(courses_student.degree_season_one) + 
          AVG(courses_student.degree_season_two)) / 4

Четыре раза! И это выглядит беспорядочно, так есть ли способ сделать его короче, например, написать его только один раз, а вместо этого просто использовать одно слово? (Я пробовал использовать "КАК", не получилось)

0
Feras 27 Ноя 2021 в 21:25
Сам факт, что у вас есть несколько оценок за экзамен в одной строке, свидетельствует о некорректной структуре данных. Строго создавайте свои таблицы в соответствии с Третьей нормальной формой, и ваша проблема просто перестанет существовать.
 – 
EdStevens
27 Ноя 2021 в 23:16

2 ответа

Лучший ответ

Для ясности, тестирования и отладки вы можете избежать повторения одного и того же длинного выражения, включив его в подзапрос. Например:

select studentname,
  case when av >= 80 then 'EXCELLENT'
       when av >= 70 then 'VERY GOOD'
       when av >= 60 then 'GOOD'
       when av >= 50 then 'ACCEPTABLE'
       else 'FAIL'
  end as grade
from (
  SELECT s.studentname,
    (avg(cs.exam_season_one) + avg(cs.exam_season_two) + 
    avg(cs.degree_season_one) + avg(cs.degree_season_two)) / 4 as av
  FROM courses_student cs
  JOIN students c on s.student_id = cs.student_id
  GROUP BY s.studentname
) x

Короче не выглядит, но обнаружить ошибку и исправить ее намного проще.

1
The Impaler 27 Ноя 2021 в 21:41
@ PM77-1 Спасибо, что указали на это.
 – 
The Impaler
27 Ноя 2021 в 21:41

Вы можете попробовать CTE так:

С CTE (SELECT student.studentname, AVG (курсы_student.exam_season_one) + AVG (курсы_student.exam_season_two) + AVG (курсы_student.degree_season_one) + AVG (курсы_student.degree_season_two)) / 4 студентов в качестве среднего курса FROMOntudent_student.INO_Two)) .student_id ГРУППА ПО ученикам.studentname) выберите имя студента, если среднее значение> = 80, затем «ОТЛИЧНО», когда среднее значение> = 70, затем «ОЧЕНЬ ХОРОШО», если среднее значение> = 60, затем «ХОРОШО», если среднее значение> = 50, затем «ПРИЕМЛЕМО» иначе 'FAIL' оканчивается оценкой CTE

0
Ramakant Mishra 27 Ноя 2021 в 23:16