Sql server 2005 TSQL查找不完整的课程

Sql server 2005 TSQL查找不完整的课程,sql-server-2005,Sql Server 2005,从StudentDetails表中 学生详情 SID Name CourseCompleted 1 Andrew CS001 1 Andrew CS002 1 Andrew CS003 2 Grey CS001 2 Grey CS005 2 Grey CS002 3 Jon CS002 3 Jon CS005 3 Jon CS008 如何生成以下输

从StudentDetails表中

学生详情

SID   Name   CourseCompleted

1    Andrew   CS001
1    Andrew   CS002
1    Andrew   CS003

2    Grey     CS001 
2    Grey     CS005 
2    Grey     CS002

3    Jon      CS002   
3    Jon      CS005 
3    Jon      CS008 
如何生成以下输出(每个学生未完成的课程)


当然,如果您有一个表列出了所有可能的课程,您可以用该表替换
from
子句中的子查询。

您有所有课程表吗?我们是否也需要完整的课程列表?所以我们可以知道“未完成”是什么。这只是为了测试同一个表,所以没有课程表needed@charpy-我想这只是一个学术练习?“在学生完成一门课程之前,您无法记录有关学生的信息,而在至少一名学生完成该模块之前,课程模块的信息才显示出来,这似乎是错误的。@马丁·史密斯既没有学术作业,也没有项目作业,谜题也没有被问到。”
SID   Name   Course Not Completed

1    Andrew   CS005
1    Andrew   CS008

2    Grey     CS003 
2    Grey     CS008 

3    Jon      CS001   
3    Jon      CS003 
With StudentDetails As
(
SELECT 1 SID,   'Andrew' Name,  'CS001' CourseCompleted union all
SELECT 1,    'Andrew',   'CS002' union all
SELECT 1 ,   'Andrew' ,  'CS003' union all
SELECT 2 ,   'Grey'    , 'CS001' union all
SELECT 2 ,   'Grey' ,    'CS005' union all
SELECT 2 ,   'Grey' ,    'CS002' union all
SELECT 3 ,   'Jon'  ,    'CS002' union all
SELECT 3 ,   'Jon'  ,    'CS005' union all
SELECT 3 ,   'Jon'  ,    'CS008' 
),
Courses AS
(
SELECT DISTINCT CourseCompleted AS Course
FROM StudentDetails
),
Students As
(
SELECT DISTINCT SID, Name
FROM StudentDetails
)

SELECT s.SID, s.name, c.Course AS [Course not Completed] FROM Students s
CROSS JOIN Courses c 
EXCEPT
SELECT SID, name, CourseCompleted
FROM StudentDetails
ORDER BY s.SID, c.Course
select distinct a.SID, a.Name, b.CourseCompleted as `Course Not Completed`
from StudentDetails a,
(select distinct CourseCompleted from StudentDetails) b
where not exists
(select 1 from StudentDetails where SID = a.SID and CourseCompleted = b.CourseCompleted)
order by a.SID
select s.SID, s.Name, c.Course as [Course Not Completed]
from (select distinct CourseCompleted [Course] from StudentDetails) c,
StudentDetails s
where not exists (
    select * from StudentDetails where SID=s.SID and CourseCompleted=c.Course
)