Запрос, чтобы найти студентов, которые взяли много курсов вместе - PullRequest
1 голос
/ 21 ноября 2019

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

Схема таблиц:

  • Student: ID int, Fname nvarchar (50), Lname nvarchar (50)
  • Course: Course_ID int, Namenvarchar (100), Created_date datetime
  • Enrollment: Student_ID int, Course_id int

Например: я хочу видеть студентов, которые прошли более трех курсов вместе.

Я хочу получить такой результат:

Course.name, Student.fname, student.lname
CSC 201,        Jhon ,         Khal
CSC 201,        Mike,          Alan
CSC 201,        Peter,         Wick
IS 220,         Jhon ,         Khal
IS 220,         Mike,          Alan
IS 220,         Peter,         Wick
.               Jhon ,         Khal
.               Mike,          Alan
.               Peter,         Wick
.
.
.
.

Вот что я придумал:

select Course.name, Student.fname, student.lname  from enrollment e
join course c on c.course.Id = e.course.Id
join student s on s.id = e.student_ID

Ответы [ 3 ]

1 голос
/ 21 ноября 2019

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

Я бы использовал агрегацию и having. Для трех произвольных курсов:

select s.id, s.fname, s.lname 
from student s join
     enrollment e
     on s.id = e.student_ID 
group by s.id, s.fname, s.lname 
having count(*) >= 3;

Обратите внимание, что таблица courses не нужна. enrollment имеет достаточно информации. не возвращает информацию о курсах - потому что ваш вопрос задает только студентов , которые соответствуют критерию.

Если вы хотите увидеть курсы,тогда string_agg() - это простейшее решение для помещения значений в одну строку:

select s.id, s.fname, s.lname,
       string_agg(c.name, ', ') as courses
from student s join
     enrollment e
     on s.id = e.student_ID join
     course c
     on c.course.Id = e.course.Id
group by s.id, s.fname, s.lname 
having count(*) >= 3;

Обратите внимание, что string_agg() является недавним дополнением к SQL Server, поэтому оно может быть недоступно в вашей версии.

0 голосов
/ 21 ноября 2019

Следующее не выиграет ни одной медали за успеваемость, но выдаст запрошенный результат:

WITH cte AS (
    SELECT s1.name AS studentname1
         , s2.name AS studentname2
         , c.name AS coursename
         , COUNT(*) OVER (PARTITION BY s1.id, s2.id) AS sharecount
    FROM course c
    JOIN enrollment AS e1 ON c.id = e1.course_id
    JOIN enrollment AS e2 ON c.id = e2.course_id AND e1.student_id < e2.student_id
    JOIN student    AS s1 ON e1.student_id = s1.id
    JOIN student    AS s2 ON e2.student_id = s2.id
)
SELECT *
FROM cte
WHERE sharecount >= 3
ORDER BY studentname1, studentname2, coursename

По сути, он объединяет таблицу регистрации с самим собой, чтобы найти все пары студентов, зачисленных на один и тот же курс, и использовать COUNT(*) OVER ()посчитать количество пар.

0 голосов
/ 21 ноября 2019

Попробуйте это ниже скрипт-

SELECT C.Name course_name, 
A.fname,
A.lname
FROM Student A
INNER JOIN Enrollment B ON A.ID = B.Student_ID
INNER JOIN Course C ON B.Course_id = C.Course_id
WHERE A.ID IN
( 
    SELECT Student_ID  
    FROM Enrollment
    GROUP BY Student_ID  
    HAVING COUNT(*) >= 3 
) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...