mysql把结果变横表_mysql-横表与纵表互转

一、认识横表与纵表:

横表就是普通的建表方式,如一个表结构为: 主键、字段1、字段2、字段3。。。

如果变成纵表后,则表结构为: 主键、字段代码、字段值,字段代码则为字段1、字段2、字段3。

纵表对从数据库到内存的映射效率是有影响的,但细一点说也要一分为二:

纵表的初始映射要慢一些; 纵表的变更的映射可能要快一些,如果只是改变了单个字段时,毕竟横表字段比纵表要多很多。

1、创建纵表结构 Table_A:

create table Table_A

(

姓名 varchar(20),

课程 varchar(20),

成绩 int

);

2、插入纵表Table_A测试数据:

insert into Table_A(姓名,课程,成绩) values('张三','语文',60);

insert into Table_A(姓名,课程,成绩) values('张三','数学',70);

insert into Table_A(姓名,课程,成绩) values('张三','英语',80);

insert into Table_A(姓名,课程,成绩) values('李四','语文',90);

insert into Table_A(姓名,课程,成绩) values('李四','数学',100);

3、创建横表结构 Table_B:

create table Table_B

(

姓名 varchar(20),

语文 int,

数学 int,

英语 int

);

4、插入横表Table_B测试数据:

insert into Table_B(姓名,语文,数学,英语) values('张三',60,70,80);

insert into Table_B(姓名,语文,数学,英语) values('李四',90,100,0);

二、纵表变横表

纵表结构 Table_A --> 横表结构 Table_B

方法:聚合函数[max或sum]配合case语句

INSERT INTO table_b

select 姓名,

sum(case 课程 when '语文' then 成绩 else 0 end) as 语文,

sum(case 课程 when '数学' then 成绩 else 0 end) as 数学,

sum(case 课程 when '英语' then 成绩 else 0 end) as 英语

from Table_A

group by 姓名

;

三、横表变纵表

横表结构 Table_B --> 纵表结构 Table_A

方法:union all

INSERT INTO table_A

select 姓名, '语文' as 课程, 语文 as 成绩 from Table_B

union all

select 姓名, '数学' as 课程, 数学 as 成绩 from Table_B

union all

select 姓名, '英语' as 课程, 英语 as 成绩 from Table_B

order by 姓名,课程 desc

;

以上。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值