概述
业务中我们经常会基于MySQL做报表统计, 或者修改了表结构后需要做数据迁移, 本文做一个列行转换的演示
环境准备
创建数据库
创建表
1 2 3 4 5 6 7 DROP TABLE IF EXISTS `score`; CREATE table `score`( `id` int PRIMARY KEY auto_increment COMMENT '主键', `name` VARCHAR(20) COMMENT '姓名', `subject` VARCHAR(20) COMMENT '科目', `score` DOUBLE default 0 COMMENT '得分' )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT '成绩表';
初始化数据
1 2 3 4 5 6 7 INSERT INTO `score` VALUES (1, '张三', '语文', 90), (2, '张三', '数学', 99), (3, '张三', '英文', 70), (4, '李四', '语文', 95), (5, '李四', '数学', 78), (6, '李四', '英文', 97);
初始化数据如下:
1 2 3 4 5 6 7 8 9 10 11 12 mysql> select * from score; +----+--------+---------+-------+ | id | name | subject | score | +----+--------+---------+-------+ | 1 | 张三 | 语文 | 90 | | 2 | 张三 | 数学 | 99 | | 3 | 张三 | 英文 | 70 | | 4 | 李四 | 语文 | 95 | | 5 | 李四 | 数学 | 78 | | 6 | 李四 | 英文 | 97 | +----+--------+---------+-------+ 6 rows in set (0.00 sec)
列行转换
1 2 3 4 5 6 7 8 SELECT `id`, `name`, SUM(CASE `subject` WHEN '语文' THEN `score` ELSE 0 END) AS '语文', SUM(CASE `subject` WHEN '数学' THEN `score` ELSE 0 END) AS '数学', SUM(CASE `subject` WHEN '英文' THEN `score` ELSE 0 END) AS '英文' FROM `score` GROUP BY `name`;
列行转换后数据结果如下
1 2 3 4 5 6 7 +----+--------+--------+--------+--------+ | id | name | 语文 | 数学 | 英文 | +----+--------+--------+--------+--------+ | 1 | 张三 | 90 | 99 | 70 | | 4 | 李四 | 95 | 78 | 97 | +----+--------+--------+--------+--------+ 2 rows in set (0.01 sec)