mysql 行转列、列转行

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 姓名;

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值