SQL-запрос для поиска студентов, получивших пятерку за каждый пройденный курс

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть следующая схема:

Студенты (sid, имя, фамилия, статус, средний балл, электронная почта)

Курсы (код отдела, номер курса, название)

Классы (classid, dept_code, номер курса, раздел #, год, семестр, лимит, class_size)

Зачисления (sid, classid, lgrade)

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

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

1. и что вы пробовали?

2. lgrade ограничены ненулевыми значениями? Кроме того, каковы возможные оценки? (Например, есть ли A , A, A- и если есть, то что вам действительно нужно — «все оценки на A», или «все оценки не ниже A», или «не меньше A -«?)

3. почему на это домашнее задание дан ответ, но студент ничего не сделал?

Ответ №1:

Я мог бы предложить сделать это с помощью агрегирования:

 select e.sid
from enrollement e
group by e.sid
having min(lgrade) = max(lgrade) and min(lgrade) = 'A';
  

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

1. Решение понравилось 😁

Ответ №2:

попробуйте это

 select * from students 
where sid not in (select distinct sid from enrollement where coalesce (lgrade,'X') <> 'A')
  

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

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

1. Это вернет студентов, у которых вообще нет оценок. Это технически соответствует требованию «кто получил пятерку за каждый пройденный курс», но я бы предположил, что это не то, что намеревается OP.

2. Я изменил его, чтобы не принимать значение lgrade null

3. «is not in» вызовет синтаксическую ошибку. «ISNULL» вызовет еще один. Возможно, это не Oracle SQL? В любом случае, OP с самого начала пометил это как Oracle, так что это от меня -1.

4. @GordonLinoff — возможно, вы правы, но это было бы разочарованием. Студент, который вообще не посещал никаких занятий, на самом деле является тем, кто получил пятерку «по всем пройденным курсам». Я знаю, что у непрофессионалов могут возникнуть проблемы с этим, но людям, работающим с реляционными базами данных, должно быть гораздо удобнее разбираться в элементарной теории множеств, чем «непрофессионалам».

5. Я отредактировал его снова, «coalesce» поддерживается oracle, и дополнительное неверно введенное «is» удалено

Ответ №3:

Постарайтесь не переусердствовать с этим:

 SELECT s.*
  FROM STUDENTS s
  WHERE s.GPA = 4.0
  

Это сработает для случая A = 4, B = 3, C = 2, D = 1, F = 0 (стандартная американская система оценивания).

Для нестандартных систем (таких как средняя школа my kids, где A = 5 за отличия и классы продвинутого обучения) мы не можем доверять GPA:

 SELECT s.*
  FROM STUDENTS s
  INNER JOIN (SELECT SID, COUNT(*) AS CLASS_COUNT
                FROM ENROLLMENTS
                GROUP BY SID) cc
  INNER JOIN (SELECT SID, COUNT(*) AS A_GRADE_COUNT
                FROM ENROLLMENTS
                WHERE LGRADE = 'A'
                GROUP BY SID) ag
    ON ag.SID = s.SID
  WHERE CLASS_COUNT = A_GRADE_COUNT
  

Желаю удачи.

Ответ №4:

Я думаю, что это самый ясный:

 select e.sid
from enrollement e
group by e.sid
having count(case when lgrade = 'A' then 1 else 0 end) = count(*) and count(*) > 0