这里我们就需要case when嵌套一下了,看着高大上,其实就是普通的嵌套而已。在第一层查出分组后的各科分数,在第二层替换成等级即可。
SELECT student_name, MAX( ? ? ? ? ? CASE subject ? ? ? ? ? WHEN '语文' THEN ? ? ? ? ? ? ? ( ? ? ? ? ? ? ? ? ? CASE ? ? ? ? ? ? ? ? ? WHEN score - (select avg(score) from t_gaokao_score where subject='语文') > 20 THEN ? ? ? ? ? ? ? ? ? ? ? '优秀' ? ? ? ? ? ? ? ? ? WHEN score - (select avg(score) from t_gaokao_score where subject='语文') > 10 THEN ? ? ? ? ? ? ? ? ? ? ? '良好' ? ? ? ? ? ? ? ? ? WHEN score - (select avg(score) from t_gaokao_score where subject='语文') >= 0 THEN ? ? ? ? ? ? ? ? ? ? ? '普通' ? ? ? ? ? ? ? ? ? ELSE ? ? ? ? ? ? ? ? ? ? ? '差' ? ? ? ? ? ? ? ? ? END ? ? ? ? ? ? ? ) ? ? ? ? ? END ? ? ? ) as '语文',? MAX( ? ? ? ? ? CASE subject ? ? ? ? ? WHEN '数学' THEN ? ? ? ? ? ? ? ( ? ? ? ? ? ? ? ? ? CASE ? ? ? ? ? ? ? ? ? WHEN score - (select avg(score) from t_gaokao_score where subject='数学') > 20 THEN ? ? ? ? ? ? ? ? ? ? ? '优秀' ? ? ? ? ? ? ? ? ? WHEN score - (select avg(score) from t_gaokao_score where subject='数学') > 10 THEN ? ? ? ? ? ? ? ? ? ? ? '良好' ? ? ? ? ? ? ? ? ? WHEN score - (select avg(score) from t_gaokao_score where subject='数学') >= 0 THEN ? ? ? ? ? ? ? ? ? ? ? '普通' ? ? ? ? ? ? ? ? ? ELSE ? ? ? ? ? ? ? ? ? ? ? '差' ? ? ? ? ? ? ? ? ? END ? ? ? ? ? ? ? ) ? ? ? ? ? END ? ? ? ) as '数学', MAX( ? ? ? ? ? CASE subject ? ? ? ? ? WHEN '英语' THEN ? ? ? ? ? ? ? ( ? ? ? ? ? ? ? ? ? CASE ? ? ? ? ? ? ? ? ? WHEN score - (select avg(score) from t_gaokao_score where subject='英语') > 20 THEN ? ? ? ? ? ? ? ? ? ? ? '优秀' ? ? ? ? ? ? ? ? ? WHEN score - (select avg(score) from t_gaokao_score where subject='英语') > 10 THEN ? ? ? ? ? ? ? ? ? ? ? '良好' ? ? ? ? ? ? ? ? ? WHEN score - (select avg(score) from t_gaokao_score where subject='英语') >= 0 THEN ? ? ? ? ? ? ? ? ? ? ? '普通' ? ? ? ? ? ? ? ? ? ELSE ? ? ? ? ? ? ? ? ? ? ? '差' ? ? ? ? ? ? ? ? ? END ? ? ? ? ? ? ? ) ? ? ? ? ? END ? ? ? ) as '英语', SUM(score) as '总分', (CASE WHEN SUM(score) > 430 THEN '重点大学' ? ?? ? ?WHEN SUM(score) > 400 THEN '一本' ? ?? ? ?WHEN SUM(score) > 350 THEN '二本' ? ?? ? ?ELSE '工地搬砖'? ?? ? ?END ) as '结果' FROM t_gaokao_score? GROUP BY student_name? ORDER BY SUM(score) desc;
我们来看一下输出结果:
+--------------+--------+--------+--------+--------+--------------+ | student_name | 语文 ? | 数学 ? | 英语 ? | 总分 ? | 结果 ? ? ? ? | +--------------+--------+--------+--------+--------+--------------+ | 林磊儿 ? ? ? | 优秀 ? | 优秀 ? | 优秀 ? | ? ?445 | 重点大学 ? ? | | 方一凡 ? ? ? | 差 ? ? | 差 ? ? | 差 ? ? | ? ?419 | 一本 ? ? ? ? | | 乔英子 ? ? ? | 普通 ? | 差 ? ? | 优秀 ? | ? ?373 | 二本 ? ? ? ? | | 陈哈哈 ? ? ? | 普通 ? | 普通 ? | 差 ? ? | ? ?309 | 工地搬砖 ? ? | +--------------+--------+--------+--------+--------+--------------+ 4 rows in set (0.00 sec)
过来人的经验来看,老实孩子最吃亏,早知道他娘的走艺体了~
四、结束语
好了,SQL方面就是以上这些内容了,有疑问可以写在评论区,哈哥会在摸鱼的时候回复你~~`
附录:创建表结构&测试数据SQL
表结构:
DROP TABLE IF EXISTS `t_gaokao_score`; CREATE TABLE `t_gaokao_score` ?( ? `id` int(0) NOT NULL AUTO_INCREMENT, ? `student_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学生姓名', ? `subject` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '科目', ? `score` double NULL DEFAULT NULL COMMENT '成绩', ? PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
导入测试数据:
INSERT INTO `t_gaokao_score` VALUES? (1, '林磊儿', '语文', 148), (2, '林磊儿', '数学', 150), (3, '林磊儿', '英语', 147), (4, '乔英子', '语文', 121), (5, '乔英子', '数学', 106), (6, '乔英子', '英语', 146), (7, '方一凡', '语文', 70), (8, '方一凡', '数学', 90), (9, '方一凡', '英语', 59), (10, '方一凡', '特长加分', 200), (11, '陈哈哈', '语文', 109), (12, '陈哈哈', '数学', 92), (13, '陈哈哈', '英语', 80);
到此这篇关于MySQL 行转列详情的文章就介绍到这了,更多相关MySQL 行转列内容请搜索
更多相关Mysql内容来自木庄网络博客
标签:Mysql
相关阅读 >>
mysql 5.7.19在centos6.5下的安装配置详解
更多相关阅读请进入《mysql》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。