Мне нужна помощь по конкретному запросу - PullRequest
0 голосов
/ 08 ноября 2018

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

Перечислите данные (neptuncode, лектор, количество зарегистрированных студентов) по тем предметам, по которым когда-либо зарегистрировалось максимум 2 студента (не забывайте опредметы, по которым еще никто не зарегистрировался)

Мои таблицы:

ENROLLMENTS
ENROLLMENT_ID   NUMBER(10,0)    No
SUBJECT NUMBER(10,0)    Yes
STUDENT NUMBER(10,0)    Yes
ENROLLMENTDATE  DATE    No
FIRSTENROLL NUMBER(1,0) No
PARITY  NVARCHAR2(4 CHAR)   No
EXAMDATE    DATE    No

STUDENTS 
STUDENT_ID  NUMBER(10,0)
NEPTUNCODE  NVARCHAR2(6 CHAR)
NAME    NVARCHAR2(30 CHAR)
ADDRESS NVARCHAR2(50 CHAR)
DATEOFBIRTH DATE
ENTRANCEYEAR    NUMBER(4,0)

SUBJECTS
SUBJECT_ID  NUMBER(10,0)
NEPTUNCODE  NVARCHAR2(10 CHAR)
SUBJECTNAME NVARCHAR2(30 CHAR)
LECTURER    NVARCHAR2(30 CHAR)
DAY1    NVARCHAR2(2 CHAR)
DAY2    NVARCHAR2(2 CHAR)
ROOM    NVARCHAR2(10 CHAR)

tables

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Я бы структурировал SQL как встроенное представление для подсчета зачислений, используя предложение HAVING, чтобы ограничить счет до 2. Тогда я бы использовал LEFT JOIN во встроенном представлении, чтобы гарантировать, что предметы без регистрации получают enrollment_count из NULL. Наконец, функция NVL (только Oracle. Для других баз данных попробуйте COALESCE), чтобы по умолчанию для любых значений NULL было 0. Ваш вопрос не требует использования таблицы STUDENTS, поскольку он касается только подсчета зачислений.

Вот код:

SELECT
s.neptuncode,
s.lecturer,
NVL(enr.enrollment_count,0) AS enrollment_count
FROM subjects s
LEFT JOIN (
              SELECT
              e.subject_id,
              COUNT(*) AS enrollment_count
              FROM enrollments e
              GROUP BY e.subject_id
              HAVING COUNT(*) <= 2
          ) enr ON enr.subject = s.subject_id;
0 голосов
/ 08 ноября 2018

Вы, вероятно, хотите GROUP BY в сочетании с HAVING. Я не уверен, что такое «NEPTUNCODE» - не уверен, какие у вас здесь ключевые отношения, но посмотрите, может ли это сработать.

РЕДАКТИРОВАТЬ: Обновлено на основе изображения ключа, добавленного к вопросу.

SELECT SUBJECTS.NEPTUNCODE, 
       SUBJECTS.LECTURER, 
       COUNT(DISTINCT STUDENTS.STUDENT_ID) STUDENTS
FROM SUBJECTS 
  LEFT JOIN ENROLLMENTS ON ENROLLMENTS.SUBJECT = SUBJECTS.SUBJECT_ID
  LEFT JOIN STUDENTS ON ENROLLMENTS.STUDENT = STUDENTS.STUDENT_ID
GROUP BY SUBJECTS.NEPTUNCODE, SUBJECTS.LECTURER
HAVING COUNT(DISTINCT STUDENTS.STUDENT_ID) <= 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...