Sql server 2008 如何查询Sql数据库以获取学生';仅限完成所有考试的学生的成绩';s阶段
Sql server 2008 如何查询Sql数据库以获取学生';仅限完成所有考试的学生的成绩';s阶段,sql-server-2008,Sql Server 2008,examstagestbl CourseId StageId 1 1 1 2 2 1 3 1 3 2 3 3 3 4 StudentId CourseId StageId StageDgree 23 1 1 30 23 1 2 25
examstagestbl
CourseId StageId
1 1
1 2
2 1
3 1
3 2
3 3
3 4
StudentId CourseId StageId StageDgree
23 1 1 30
23 1 2 25
23 3 1 30
10 1 1 27
10 2 1 30
studentsresultbl
CourseId StageId
1 1
1 2
2 1
3 1
3 2
3 3
3 4
StudentId CourseId StageId StageDgree
23 1 1 30
23 1 2 25
23 3 1 30
10 1 1 27
10 2 1 30
请了解如何从表studentsresultbl
中获取所有记录,这些记录仅适用于完成所有考试阶段的学生。
情景:
从上表中可以看出:
23号学生参加了课程1和3的考试,但他只完成了课程1。
10号学生参加了课程1和2的考试,但他只完成了课程2。
因此,如何使用SQL语句获得结果(如果学生在所有课程阶段都有考试),请尝试以下方法:
DECLARE @courses TABLE
(
CourseID INT ,
StageID INT
)
DECLARE @results TABLE
(
StudentID INT ,
CourseID INT ,
StageID INT
)
INSERT INTO @courses
VALUES ( 1, 1 ),
( 1, 2 ),
( 2, 1 ),
( 3, 1 ),
( 3, 2 ),
( 3, 3 ),
( 3, 4 )
INSERT INTO @results
VALUES ( 23, 1, 1 ),
( 23, 1, 2 ),
( 23, 3, 1 ),
( 10, 1, 1 ),
( 10, 2, 1 );
WITH cte1
AS ( SELECT CourseID ,
COUNT(*) AS StageCount
FROM @courses c
GROUP BY CourseID
),
cte2
AS ( SELECT StudentID ,
CourseID ,
COUNT(DISTINCT StageID) AS StageCount
FROM @results c
GROUP BY StudentID ,
CourseID
)
SELECT cte2.StudentID ,
cte2.CourseID
FROM cte2
JOIN cte1 ON cte1.CourseID = cte2.CourseID
WHERE cte1.StageCount = cte2.StageCount
ORDER BY cte2.StudentID ,
cte2.CourseID
输出:
StudentID CourseID
10 2
23 1
你想让那些至少完成了一门课程和所有阶段的学生,还是完成了所有课程和所有阶段的学生?如果学生完成了课程中所有考试的阶段,我需要显示所有课程的结果。e、 g:学生23完成课程1的所有阶段,但不完成课程3,学生10只完成课程2