SQL - оценить минимальное значение по нескольким строкам, а затем отфильтровать, чтобы показать список уникальных строк? - PullRequest
0 голосов
/ 03 июня 2019

Моя конечная цель состоит в том, чтобы составить список почетных учеников.У каждого ученика есть несколько рядов, по одному на каждый класс.Я хочу сказать, посмотрите на их оценки через эти ряды;показывать только одно имя учащегося, если ни одна из его оценок не превышает 80%.

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

SELECT students.first_name, students.last_name, storedgrades.storecode, storedgrades.percent,storedgrades.course_name
FROM storedgrades join
     students
     on students.ID = storedgrades.StudentID
where students.enroll_status=0  AND
      storedgrades.termid>2799  AND
      storedgrades.storecode = 'Q4'

Пример таблицы оценок:

BOB  A  95
BOB D  65
ANDREA  B  85
ANDREA  A  95

ПРИМЕР РЕЗУЛЬТАТА:

ANDREA

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Выберите отдельный список имен учеников, затем сравните его с отметкой НЕ СУЩЕСТВУЕТ в таблице оценок, где оценка составляет менее 80%

SELECT distinct students.ID, students.first_name, students.last_name
FROM storedgrades s join
     students
     on students.ID = storedgrades.StudentID
where students.enroll_status=0  AND
      storedgrades.termid>2799  AND
      storedgrades.storecode = 'Q4' and not exists
      (select 'x' from storedgrades s2 where s2.students.StudentID = s.StudentID and s2.first_name = s.first_name and 
s.last_name = s2.last_name and s2.percent < 80)

РЕДАКТИРОВАТЬ: добавлено в идентификатор студента к объединению

0 голосов
/ 03 июня 2019

Использовать агрегацию. Я думаю, что это то, что вы хотите:

select s.id, s.first_name, s.last_name
from students s join
     storedgrades sg 
     on s.ID = sg.StudentID
where s.enroll_status = 0  and
      sg.termid > 2799  AND
      sg.storecode = 'Q4'
group by s.id, s.first_name, s.last_name
having count(*) = 5 and  -- you want all five courses
       min(scorecode) >= 80;
...