Количество SQL Количество одноклассников для студента по всем курсам - PullRequest
0 голосов
/ 06 октября 2019

У меня есть следующие таблицы:

  • Студент : Student_ID (PK), Student_Name
  • Course : Course_ID (PK), Course_Name
  • Зачисление : Student_ID (FK), Course_ID (FK)

Мне нужно 2 запроса:

  1. Запрос, который вычисляет для каждого студента id в таблице Student общее количество разных (уникальных) одноклассников, которое этот студент имеет на всех курсах. Если учащийся не зачислен ни в один из курсов, следует вернуть 0.

    Например, если Student_ID 123 зарегистрирован в 3 курсах и у него по 10 разных одноклассников на каждом из этих курсов, я должен получить следующий результат:

    Student_ID        Num_of_classmates
    -----------------------------------
    123               30
    
  2. SQL-запрос, который возвращает всех учащихся со всеми их одноклассниками. Одноклассник ученика - это еще один ученик, зачисленный хотя бы в один класс.

Ответы [ 2 ]

2 голосов
/ 06 октября 2019

Неясно, какой из них вы хотите:

  • Общее количество учеников во всех классах (включая одного учащегося).
  • Всего отдельных учеников, поскольку некоторые одноклассники могутбыть в нескольких классах.
  • Всего отдельных учеников, не считая данного ученика («Я не мой собственный одноклассник»).

В любом случае, идея состоит в основном из двух соединений иагрегация:

select s.student_id,
       count(ec.student_id) as total_classmates,
       count(distinct s.student_id) as distinct_classmates,
       count(distinct case when ec.student_id <> s.student_id then ec.student_id end) as distinct_other_classmates
from student s left join
     enrollment e
     on e.student_id = s.student_id left join
     enrollment ec
     on ec.class_id = e.class_id;
group by s.student_id;
1 голос
/ 06 октября 2019

Здесь я даю решение только для части 2), поскольку @Gordon Linoff выполнил часть 1), а вы также исправили проблему -1.

Точка: используйте inner join вместо left join здесь, чтобы избежать NULL в именах одноклассников. Надеемся, что это также добавляет немного помощи:)

Набор тестовых данных

if object_id('tempdb..#Student') is not null drop table #Student;
create table #Student (
    Student_ID int PRIMARY key,
    Student_Name varchar(50)
)
insert into #Student(Student_ID, Student_Name)
values (1,'Alice'), (2,'Bob'),(3,'Claire'),(4,'Danny'),(5,'Eve'),(6,'Frank');

if object_id('tempdb..#Course') is not null drop table #Course;
create table #Course (
    Course_ID int PRIMARY key,
    Course_Name varchar(50)
)
insert into #Course(Course_ID, Course_Name)
values (1,'Algorithm'), (2,'Bash'),(3,'Compiler'),(4,'Design Pattern'),(5,'Exception Handling');

if object_id('tempdb..#Enrollment') is not null drop table #Enrollment;
create table #Enrollment (
    Student_ID int,
    Course_ID int
)
insert into #Enrollment(Student_ID, Course_ID)
values (1,1),(1,3),
       (2,2),(2,3),
       (3,3),(3,4),
       (4,1),(4,4),
       (5,1),
       (6,5);  -- This Frank guy has no classmate

-- select * from #Student;
-- select * from #Course;
-- select * from #Enrollment;

Решение для 2)

select distinct
    A.Student_Name as Student_Name,
    D.Student_Name as Classmate_Name
from #Student as A
-- Student (A) -> Enrolled Courses (B)
inner join #Enrollment as B  
    on A.Student_ID = B.Student_ID
-- Enrollment Courses (B) -> Enrolled Students in that Course (C)
inner join #Enrollment as C  
    on B.Course_ID = C.Course_ID
    and B.Student_ID <> C.Student_ID  -- exclude self
-- Classmate's names
inner join #Student as D
    on C.Student_ID = D.Student_ID
order by Student_Name, Classmate_Name;

Вывод

Примечание: у Фрэнка нет одноклассников, и они не показывают значение NULL.

| Student_Name | Classmate_Name |
|--------------|----------------|
| Alice        | Bob            |
| Alice        | Claire         |
| Alice        | Danny          |
| Alice        | Eve            |
| Bob          | Alice          |
| Bob          | Claire         |
| Claire       | Alice          |
| Claire       | Bob            |
| Claire       | Danny          |
| Danny        | Alice          |
| Danny        | Claire         |
| Danny        | Eve            |
| Eve          | Alice          |
| Eve          | Danny          |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...