使用SQL server请创建存储过程, 查看“计算机基础”课程本次考试平均分以及未通过考试 的学员名单。(笔试成绩满分 80 分,上机成绩满分 20 分,双科成绩均达到满分 的 80%以上为优秀, 单科不足满分的60%为不合格, 否则为合格)。(提示: 用带 有游标的存储过程)
时间: 2024-01-21 13:16:58 浏览: 21
以下是使用 SQL Server 创建的带有游标的存储过程,用于查看“计算机基础”课程本次考试平均分以及未通过考试的学员名单。
```sql
CREATE PROCEDURE sp_exam_analysis
AS
BEGIN
DECLARE @avg FLOAT, @pass_score FLOAT, @pass_rate FLOAT
DECLARE @stu_name VARCHAR(50), @stu_id VARCHAR(20), @written_score INT, @lab_score INT, @total_score FLOAT, @is_pass BIT
DECLARE @pass_stu_num INT, @fail_stu_num INT
-- 计算总人数和通过人数
SELECT @pass_stu_num = COUNT(*) FROM exam_scores WHERE total_score >= 60
SELECT @fail_stu_num = COUNT(*) FROM exam_scores WHERE total_score < 60
-- 计算及格分数线
SELECT @pass_score = AVG(total_score) FROM exam_scores WHERE total_score >= 60
-- 计算平均分
DECLARE cur_exam CURSOR FOR SELECT written_score, lab_score FROM exam_scores
OPEN cur_exam
FETCH NEXT FROM cur_exam INTO @written_score, @lab_score
SET @total_score = 0
WHILE @@FETCH_STATUS = 0
BEGIN
SET @total_score = @total_score + @written_score + @lab_score
FETCH NEXT FROM cur_exam INTO @written_score, @lab_score
END
CLOSE cur_exam
DEALLOCATE cur_exam
SELECT @avg = @total_score / (COUNT(*) * 100.0)
-- 查询未通过考试的学员名单
DECLARE cur_fail CURSOR FOR SELECT stu_name, stu_id FROM exam_scores WHERE total_score < 60
OPEN cur_fail
FETCH NEXT FROM cur_fail INTO @stu_name, @stu_id
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT '学员 ' + @stu_name + '(' + @stu_id + ') 未通过考试'
FETCH NEXT FROM cur_fail INTO @stu_name, @stu_id
END
CLOSE cur_fail
DEALLOCATE cur_fail
-- 输出统计结果
PRINT '本次考试平均分为 ' + CONVERT(VARCHAR, @avg)
PRINT '及格分数线为 ' + CONVERT(VARCHAR, @pass_score)
SET @pass_rate = @pass_stu_num * 1.0 / COUNT(*) * 100.0
PRINT '本次考试通过率为 ' + CONVERT(VARCHAR, @pass_rate) + '%'
PRINT '未通过考试的学员总数为 ' + CONVERT(VARCHAR, @fail_stu_num)
END
```
在该存储过程中,首先使用两个 SELECT 语句分别计算通过考试的学员人数和未通过考试的学员人数。然后,使用 AVG 函数计算及格分数线,通过游标计算平均分,并使用另一个游标查询未通过考试的学员名单。最后,输出统计结果。