#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