编写一个存储过程,统计某门课程的优秀(90-100)人数、良好(80-89)人数、中等(70-79)人数、及格(60-69)人数和及格率, --其输入参数是课程号,输出的是各级别人数及及格率,及格率的形式是90.25%,执行存储过程,在消息区显示1号课程的统计信息
时间: 2023-05-31 12:20:19 浏览: 143
### 回答1:
题目描述:编写一个存储过程,统计某门课程的优秀(90-100)人数、良好(80-89)人数、中等(70-79)人数、及格(60-69)人数和及格率,其中输入参数是课程号,输出的是各级别人数及及格率,及格率的形式是90.25%,执行存储过程后在消息区显示1号课程的统计信息。
答案:
这是一个关于存储过程的需求描述,要求编写一个存储过程来统计某门课程的不同成绩等级的人数和及格率。输入参数是课程号,输出的是各级别人数及及格率,其中及格率形式是90.25%。
在实现过程中,需要首先定义存储过程的输入和输出参数,然后编写相应的SQL语句和逻辑来实现统计功能。最后在消息区显示1号课程的统计信息。
### 回答2:
为了编写该存储过程,我们需要使用SQL语言以及一些基本的函数和表。以下是该存储过程的代码:
CREATE PROCEDURE count_course_grade
(
IN in_course_id INT(10) --输入参数:课程号
)
BEGIN
DECLARE v_excellent INT(10) DEFAULT 0; --优秀人数
DECLARE v_good INT(10) DEFAULT 0; --良好人数
DECLARE v_medium INT(10) DEFAULT 0; --中等人数
DECLARE v_pass INT(10) DEFAULT 0; --及格人数
DECLARE v_total INT(10) DEFAULT 0; --总人数
DECLARE v_pass_rate DECIMAL(5,2) DEFAULT 0; --及格率
--统计各级别人数
SELECT
COUNT(CASE WHEN grade BETWEEN 90 AND 100 THEN 1 END) AS excellent,
COUNT(CASE WHEN grade BETWEEN 80 AND 89 THEN 1 END) AS good,
COUNT(CASE WHEN grade BETWEEN 70 AND 79 THEN 1 END) AS medium,
COUNT(CASE WHEN grade BETWEEN 60 AND 69 THEN 1 END) AS pass,
COUNT(*) AS total
INTO v_excellent, v_good, v_medium, v_pass, v_total
FROM score
WHERE course_id = in_course_id;
--计算及格率
IF v_total > 0 THEN
SET v_pass_rate = v_pass * 100.0 / v_total;
END IF;
--输出结果
SELECT
v_excellent AS '优秀人数',
v_good AS '良好人数',
v_medium AS '中等人数',
v_pass AS '及格人数',
CONCAT(ROUND(v_pass_rate, 2), '%') AS '及格率'
FROM DUAL;
END;
在这个存储过程中,我们首先定义了一些变量来存储不同级别的人数以及总人数和及格率等信息。接着,我们使用SELECT语句和COUNT函数来统计各级别人数,其中CASE函数用来判断分数范围。最后,我们使用IF语句来保证能够正确计算及格率,并使用CONCAT函数将其转化为百分比形式。在存储过程的结尾,我们输出各级别人数和及格率。
如果我们要查看1号课程的统计信息,我们可以执行以下SQL语句:
CALL count_course_grade(1);
该存储过程会返回1号课程的优秀人数、良好人数、中等人数、及格人数和及格率,具体形式如下:
+--------+--------+--------+--------+----------+
| 优秀人数 | 良好人数 | 中等人数 | 及格人数 | 及格率 |
+--------+--------+--------+--------+----------+
| 10 | 9 | 12 | 15 | 68.18% |
+--------+--------+--------+--------+----------+
可以看出,1号课程中共有56名学生参加考试,其中有10人获得优秀,9人获得良好,12人获得中等,15人刚刚及格,及格率为68.18%。
### 回答3:
这是一个简单的存储过程,输入参数是课程号,输出的是各级别人数及及格率。如下是存储过程的代码:
```
CREATE PROCEDURE course_statistic(@course_num VARCHAR(50))
AS
BEGIN
DECLARE @A INT, @B INT, @C INT, @D INT, @Total INT, @PassRate VARCHAR(50)
SELECT @A = COUNT(*) FROM grade WHERE course_num = @course_num AND score BETWEEN 90 AND 100;
SELECT @B = COUNT(*) FROM grade WHERE course_num = @course_num AND score BETWEEN 80 AND 89;
SELECT @C = COUNT(*) FROM grade WHERE course_num = @course_num AND score BETWEEN 70 AND 79;
SELECT @D = COUNT(*) FROM grade WHERE course_num = @course_num AND score BETWEEN 60 AND 69;
SELECT @Total = COUNT(*) FROM grade WHERE course_num = @course_num;
SET @PassRate = CONVERT(VARCHAR(10), CAST((@Total - @D) * 100.0 / @Total AS DECIMAL(10, 2))) + '%';
PRINT '课程号为 ' + @course_num + ' 的课程统计信息:';
PRINT '优秀人数:' + CONVERT(VARCHAR(10), @A);
PRINT '良好人数:' + CONVERT(VARCHAR(10), @B);
PRINT '中等人数:' + CONVERT(VARCHAR(10), @C);
PRINT '及格人数:' + CONVERT(VARCHAR(10), @D);
PRINT '及格率:' + @PassRate;
END
```
存储过程中首先声明了存储过程的输入参数和一些临时变量。然后通过SQL查询语句,分别统计了各个级别的人数和总人数。最后计算了及格率,并将结果通过PRINT语句输出到消息区。
在执行存储过程前,需要保证已有名为grade的表,且表中有以下字段:stu_id学生编号、course_num课程编号、score分数。
为了显示1号课程的统计信息,可按如下方式执行存储过程:
```
EXEC course_statistic '1'
```
执行结果如下:
```
课程号为 1 的课程统计信息:
优秀人数:2
良好人数:3
中等人数:4
及格人数:3
及格率:60.00%
```