映射多个项目

时间:2018-06-10 23:02:20

标签: sql sql-server

我正在使用如下所示的数据库:

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]

1 个答案:

答案 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