Sql server 2005 TSQL查找不完整的课程
从StudentDetails表中 学生详情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 如何生成以下输
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
)