Результаты за семестр и отображение количества cgpa по диапазону

#java #sql #oracle

#java #sql #Oracle

Вопрос:

Как рассчитать количество оценок по семестрам и диапазону оценок.

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

СЕМЕЦЕР

SEMISTER_NO Имя
1 Первый
2 ВТОРОЙ

STUDENT_SEMETSER

STUDENT_NO SEMESTER_NO ОЦЕНКА
1 1 9.8
2 1 9.2
3 1 8.8
4 1 7.8
5 1 7.5
6 1 7.2
7 2 8.8
8 2 8.2
9 2 8.8
10 2 6.8
11 2 6.5
12 2 6.2

ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ:

SEMESTER_NO ОЦЕНКА 10-9 ОЦЕНКА 9-8 8-7 7-6 6-5 5-4
1 2 1 3 0 0 0
2 0 3 0 2 0 0

Комментарии:

1. Если я правильно понимаю, это должно быть 3 для score 7-6 in SEMESTER_NO 2

2. Пожалуйста, для вашего собственного здравомыслия, исправьте опечатки: это семестр , а не «семестр » или «СЕМЕСТР»

Ответ №1:

Использование CASE-WHEN и PIVOT является одним из вариантов:

 SELECT *
FROM 
(
  SELECT semester_no,
          CASE 
            WHEN SCORE>= 9 and SCORE<=10 THEN 'Score 10-9'
            WHEN SCORE>= 8 and SCORE<9 THEN 'Score 9-8'
            WHEN SCORE>= 7 and SCORE<8 THEN 'Score 8-7'
            WHEN SCORE>= 6 and SCORE<7 THEN 'Score 7-6'
            WHEN SCORE>= 5 and SCORE<6 THEN 'Score 6-5'
            WHEN SCORE>= 4 and SCORE<5 THEN 'Score 5-4'
          END AS score_cat
   FROM student_semester
)
PIVOT 
(
   COUNT(score_cat)
   FOR score_cat IN ('Score 10-9','Score 9-8','Score 8-7','Score 7-6','Score 6-5','Score 5-4')
)
ORDER BY semester_no
 

CASE Оператор распределит оценку по разным сегментам (изменит в соответствии с вашими потребностями), а PIVOT оператор переместит данные на желаемый уровень.

ДЕМОНСТРАЦИЯ

Комментарии:

1. Вам действительно нужно проверять <=10 ? Если вы уже обработали >=9 строку ранее, то вам не нужно снова проверять наличие <9 в строке «>= 8»

2. Спасибо за ваш вклад. Проверки на <9 наличие и другие можно было бы избежать. Согласен с вами! Тем не менее, я чувствую, что мы все еще можем проверить <=10 в первом условии, потому что мы можем не знать фактическую верхнюю границу оценки. Ваши мысли?

3. Я ожидаю , что результаты будут в диапазоне 1-10, но в данном случае я могу ошибаться.