前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL行转列的小需求

MySQL行转列的小需求

作者头像
bisal
发布2021-09-06 15:43:40
1.1K0
发布2021-09-06 15:43:40
举报
文章被收录于专栏:bisal的个人杂货铺

一个要在MySQL实现的行转列的SQL需求,原始数据形如,

代码语言:javascript
复制
ID  DATE        KEY  VALUE
A   2021-03-15  F1   1
A   2021-03-15  F2   2
B   2021-03-15  F1   3
B   2021-03-15  F2   4

需要转换为,

代码语言:javascript
复制
ID  F1  F2
------------
A   1   2
B   3   4

创建测试表,

代码语言:javascript
复制
create table test (
id varchar(15),
c_date date,
key varchar(15),
value int);

插入测试数据,

代码语言:javascript
复制
insert into test values('A','2021-03-15','F1',1);
insert into test values('A','2021-03-15','F2',2);
insert into test values('B','2021-03-15','F1',3);
insert into test values('B','2021-03-15','F2',4);


mysql> select * from test;
+--------+------------+-----------+-------+
| id     | c_date     | key       | value |
+--------+------------+-----------+-------+
| A      | 2021-03-15 | F1        |     1 |
| B      | 2021-03-15 | F2        |     2 |
| A      | 2021-03-15 | F1        |     3 |
| B      | 2021-03-15 | F2        |     4 |
+--------+------------+-----------+-------+

方案1,利用group by对id做聚集,通过case ... when和max得到每个id对应的value,注意,

(1) 需要带上else,否则有些字段,会为空。

(2) 因为用了group by,必须用上max或者其他的函数,否则返回结果多余1条,逻辑就错了。

代码语言:javascript
复制
select id, 
       max(case key when 'F1' then value else 0 end) F1, 
       max(case key when 'F2' then value else 0 end) F2 
from test 
where c_date='2021-03-15' 
group by id;


+--------+------+------+
| id     |   F1 |   F2 |
+--------+------+------+
| A      |    1 |    2 |
| B      |    3 |    4 |
+--------+------+------+

方案2,这种方式,会读取多次test表,

代码语言:javascript
复制
select distinct a.id,
(select value from test b where a.id=b.id and b.key='F1') as 'F1',
(select value from test b where a.id=b.id and b.key='F2') as 'F2'
where a.c_date='2021-03-15'
from test a
+--------+------+------+
| id     |   F1 |   F2 |
+--------+------+------+
| A      |    1 |    2 |
| B      |    3 |    4 |
+--------+------+------+
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档