#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_NO2
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, но в данном случае я могу ошибаться.