Как вывести значение, ссылаясь на другое значение? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть таблица, которая включает имя ученика, course_id и оценку, разные студенты могут иметь разные курсы и разные оценки.

А теперь мне нужно вывести академические оценки для каждого студента, вот правило для академических оценок:

  1. Если студент выберет только один курс (count (course_id) = 1), он / она получит «Хорошо», если оценка> = 50, и «Реферал», если оценка <50; </li>
  2. Если студент проходит более одного курса (count (course_id)> = 2), его / ее академическое положение будет «Испытание», если ни один из баллов> = 50, «Направление», если 50% или меньше от Прошедшие курсы имеют оценку> = 50 и «Хорошо» в противном случае.

Таблица:

Student_name|   course_id |score
Shirley Caws      55993     10
Lana Glendenning  56988     81
Michael           54880     80
Michael           54895     71
Sean Turle        56986     32
Sean Turle        56991     48
Sean Turle        56992     20
Damchu Tenzin     56215     40
Damchu Tenzin     56219     90
Blake Croll       57179     30
Blake Croll       57264     20

Я в течение часа пытался написать «СЛУЧАЙ КОГДА», но не смог получить правильный ответ. ВЫБЕРИТЕ имя студента, (СЛУЧАЙ КОГДА .... ТОЛЬКО КОНЕЦ) В КАЧЕСТВЕ УЧЕБНЫХ ПОЛОЖЕНИЙ ОТ таблицы;

Ожидаемые результаты:

Student_name|    Academic_standings
Shirley Caws     Referral
Lana Glendenning Good
Michael          Good
Sean Turle       Probation
Damchu Tenzin    Referral
Blake Croll      Probation

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Я бы попробовал что-то вроде этого - сначала посчитайте классы, а затем примените свою логику:

; with CTE as (
    Select StudentName
    , Count(distinct CourseID) as TotalClasses
    , Count(distinct case when score < 50 then CourseID end) as ClassesUnder50
    From MyTable
    Group By StudentName
)

Select StudentName
    , Case when TotalClasses = 1 and ClassesUnder50 = 0 then 'Good'
           when TotalClasses = 1 and ClassesUnder50 = 1 then 'Referral'
           when TotalClasses > 1 and ClassesUnder50 = TotalClasses then 'Probation'
           when TotalClasses > 1 and ClassesUnder50*1.0/TotalClasses >= 0.5 then 'Referral'
           else 'Good' end as Standing
from CTE
0 голосов
/ 17 апреля 2019

Вы можете использовать функции агрегирования и условного агрегирования:

select student_name,
       (case when count(*) = 1 and max(score) >= 50 then 'Good'
             when count(*) = 1 then 'Referral'
             when max(score) < 50 then 'Probation'
             when sum(case when score >= 50 then 1 else -1 end) <= 0 then 'Referral'
             else 'Good'
        end) as academic_standing             
from t
group by student_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...