mysql 行转列、列转行
1、行转列
行转列是指把数据表中具有相同key值的多行value数据,转换为使用一个key值的多列数据,使每一行数据中,一个key对应多个value。
行转列完成后,在视觉上的效果就是:表中的总行数减少了,但是列数增加了。
如下所示的转换过程就是一个简单的行转列的过程:
drop table if exists 学生成绩表;
create table 学生成绩表(
姓名 varchar(20),
课程 varchar(20),
分数 int
);
insert into 学生成绩表 values( '张三', '语文', 74);
insert into 学生成绩表 values( '张三', '数学', 83);
insert into 学生成绩表 values( '张三', '物理', 63);
insert into 学生成绩表 values( '李四', '语文', 74);
insert into 学生成绩表 values( '李四', '数学', 84);
-- 原结构
select * from 学生成绩表;
-- 行转列
select
姓名,
sum(case 课程 when '语文' then 分数 end) AS 语文 ,
sum(case 课程 when '数学' then 分数 end) AS 数学 ,
sum(case 课程 when '物理' then 分数 end) AS 物理
from 学生成绩表
group by 姓名;
2、列转行
列转行是指把表中同一个key值对应的多个value列,转换为多行数据,使每一行数据中,保证一个key只对应一个value。
列转行完成之后,在视觉上的效果就是:表中的列数减少了,但是行数增加了。
如下所示的转换过程就是一个简单的列转行过程:
drop table if exists 学生成绩表2;
create table 学生成绩表2(
姓名 varchar(20),
语文 int,
数学 int,
物理 int
);
insert into 学生成绩表2 values( '张三', 74 , 83, 63);
insert into 学生成绩表2 values( '李四', 74 , 84, null);
-- 原结构
select * from 学生成绩表2;
-- 列转行
select 姓名, '语文' as 课程, 语文 as 分数 from 学生成绩表2
union
select 姓名, '数学' as 课程, 数学 as 分数 from 学生成绩表2
union
select 姓名, '物理' as 课程, 物理 as 分数 from 学生成绩表2
order by 姓名;