学生成绩单出炉啦

 


材料:

(1)数据库,mysql

(2)场景为打印学生成绩单

1、创建数据表,学生表、课程表和分数表。
学生成绩单出炉啦
CREATE TABLE `student` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `psw` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8


CREATE TABLE `t_course` (
  `CourseName` varchar(50) DEFAULT NULL,
  `CourseID` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

2、创建存储过程,实现行列转换

基本原理,根据课程多少来生成行转列的SQL语句。


CREATE TABLE `t_score` (
  `stuID` int(11) DEFAULT NULL,
  `CourseID` int(11) DEFAULT NULL,
  `Score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
USE `test`$$

DROP PROCEDURE IF EXISTS `sp_score`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_score`()
BEGIN
 DECLARE v_sql TEXT;
 DECLARE ssql TEXT;
 DECLARE L_sql TEXT;
 DECLARE Add_sql TEXT;
 DECLARE R_sql TEXT;
 DECLARE CourseID INT;
 DECLARE CourseName VARCHAR(50);
 DECLARE no_more_Courses INT  DEFAULT 0;
 -- 定义游标
 DECLARE courses CURSOR
 FOR
            SELECT a.CourseID,a.CourseName FROM t_course a ;
 
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_courses=1;
 SET no_more_courses=0;
 SET R_sql=' FROM student a,t_score b WHERE a.id=b.stuID GROUP BY a.id';
 SET L_sql=' SELECT a.id as ''学生编号'',a.name ''姓名''';
 -- 打开游标
 OPEN courses;
 -- 循环所有的行
 REPEAT
-- Get course
       FETCH courses INTO CourseID,CourseName;
        IF no_more_Courses=0 THEN
                 SET Add_sql = CONCAT(',MAX(CASE b.CourseID WHEN ',CourseID,' THEN b.Score ELSE 0 END) AS ''',CourseName,'''');
          SET L_sql = CONCAT(L_sql,ADD_sql);
        END IF; 
        UNTIL no_more_Courses
       END REPEAT; -- 循环结束
 -- 关闭游标
 CLOSE courses;
 SET v_sql=CONCAT(L_sql,R_sql);
 SET @ssql = v_sql;
 PREPARE sl FROM @ssql;
 EXECUTE sl;
 
    END$$

3、成绩单炒制成功啦

---调用存储过程

 CALL sp_score()


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值