题目
标准的行转列做法,有很多种做法 case when,我这里选择的是 mysql的预处理语句
MySQL官方将prepare、execute、deallocate统称为PREPARE STATEMENT
查变百度 都是返回两个结果集的,无奈只能获取第二个数据集
大佬写的文章
https://www.cnblogs.com/hanjun0612/p/9779789.html
表结构
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `xxl-job-stu`;
CREATE TABLE `xxl-job-stu` (
`name` varchar(64) DEFAULT NULL,
`course` varchar(32) DEFAULT NULL,
`score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of student
-- ----------------------------
BEGIN;
INSERT INTO `xxl-job-stu` VALUES ('张青', '语文', 72);
INSERT INTO `xxl-job-stu` VALUES ('王凤', '数学', 72);
INSERT INTO `xxl-job-stu` VALUES ('张华', '英语', 81);
INSERT INTO `xxl-job-stu` VALUES ('张青', '物理', 67);
INSERT INTO `xxl-job-stu` VALUES ('李立', '化学', 98);
INSERT INTO `xxl-job-stu` VALUES ('张燕', '物理', 75);
INSERT INTO `xxl-job-stu` VALUES ('张青', '化学', 76);
INSERT INTO `xxl-job-stu` VALUES ('张华', '数学', 80);
INSERT INTO `xxl-job-stu` VALUES ('张燕', '语文', 90);
COMMIT;
sql解决方案
-- drop PROCEDURE sp_mytest 删除存储过程
-- 注意 WITH ROLLUP 的使用
create PROCEDURE sp_mytest()
begin
SET @EE='';
select @EE :=CONCAT(@EE,'sum(if(course= \'',course,'\',score,0)) as ',course, ',') AS aa FROM (SELECT DISTINCT course FROM `xxl-job-stu`) A;
SET @QQ = CONCAT('select name,',@EE,' sum(score) as 总成绩 from `xxl-job-stu` group by name WITH ROLLUP ');
PREPARE stmt FROM @QQ;
EXECUTE stmt;
end
-- 运行存储过程
call sp_mytest()
结果
使用 mybatis 的情况直接 或者 list结果集 get(0) 就可以了
如果你找到更好的解决方案 可以下面评论一下更好