我正在使用如下所示的数据库:
CREATE TABLE Students(
[StudentId] [int],
...,
[MajorId] [int]
);
CREATE TABLE Majors(
[MajorId] [int],
...,
[MajorDes] [varchar](20)
);
CREATE TABLE CourseRequiredForEachMajor(
[MajorId] [int],
...,
[CourseTitle] [varchar](20)
);
CREATE TABLE CoursesCompletedByStudents(
[StudentId] [int],
...,
[CourseTitle][varchar] (20)
);
INSERT INTO Majors ([MajorId] , .. , [MajorDes]) VALUES (1, ... . 'IT');
INSERT INTO Students ([StudentId], .. , [MajorId]) VALUES (1, ... . 1);
INSERT INTO CourseRequiredForEachMajor ([MajorId], .. , [CourseTitle]) VALUES (1, ... . 'IT101');
INSERT INTO CourseRequiredForEachMajor ([MajorId], .. , [CourseTitle]) VALUES (1,...,'IT302');
INSERT INTO CourseRequiredForEachMajor ([MajorId], .. , [CourseTitle]) VALUES(1,...,'IT321');
INSERT INTO CoursesCompletedByStudents ([StudentId], .. , [CourseTitle]) VALUES (1, ... . 'IT101');
INSERT INTO CoursesCompletedByStudents ([StudentId], .. , [CourseTitle]) VALUES (1,...,'IT302');
INSERT INTO CoursesCompletedByStudents ([StudentId], .. , [CourseTitle]) VALUES(2,...,'IT321');
我正在尝试列出每个学生的缺失课程,以完成每个专业的所有要求(例如,在上图中,我想说,学生#1需要参加课程IT321才能完成majorId#1的所有要求。 无论如何我还能做到显示完成百分比吗? (例如,studentId#1在专业要求的3门课程中完成了两门课程(66.6%))。计算这个的方法是什么。
我真的不知道如何解决这个问题,但这是我的尝试:
Select CoursesCompletedByStudents.CourseTitle from Students,MajorsCourseRequiredForEachMajor,CoursesCompletedByStudents
where Students.MajorId= Major.MajorId and Studetns.StudentId = CoursesCompletedByStudents.[StudentId]
and CourseRequiredForEachMajor.[CourseTitle]=CoursesCompletedByStudents.[CourseTitle]
答案 0 :(得分:0)
此查询将提供所需的结果。
with coursesCTE as
(
Select StudentId, CourseTitle, m.MajorId
from Students s
join Majors m
on s.MajorId = m.MajorID
join CourseRequiredForEachMajor cr
on cr.MajorId = m.MajorID
),
completedCTE
as
(
Select StudentId, cc.courseTitle, MajorId
from CoursesCompletedByStudents cc
join CourseRequiredForEachMajor cm
on cc.CourseTitle = cm.CourseTitle
)
Select * from coursesCTE
except
Select * from completedCTE
如果你想要逗号分隔的课程ID,你可以使用Stuff / XML路径hack或STRING_AGG如果你正在使用SQL Server 2017