MySQL行转列的小需求

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

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

需要转换为,

ID  F1  F2
------------
A   1   2
B   3   4

创建测试表,

create table test (
id varchar(15),
c_date date,
key varchar(15),
value int);

插入测试数据,

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条,逻辑就错了。

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表,

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 |
+--------+------+------+

近期更新的文章:

Oracle的greatest和least函数

我的股市生涯

Oracle创建主键的三种方式

非Oracle Linux下Oracle 19c CDB数据库安装

案例纠正一则

小白学习MySQL - 数据库软件和初始化安装

小白学习MySQL - 闲聊聊

Redis和Sentinel的安装部署和配置

“火线”和“零线”

通过索引提升SQL性能案例一则

如何手动添加jar包到maven本地库?

1元股权转让的一点思考

如何打造一个经常宕机的业务系统?

Linux恢复误删文件的操作

Linux的scp指令使用场景

Oracle处理IN的几种方式

如何搭建一支拖垮公司的技术团队?

IP地址解析的规则

MySQL的skip-grant-tables

国产数据库不平凡的一年

Oracle要求顺序的top数据检索问题

日常工作中碰到的几个技术问题

了解一下sqlhc

Oracle的MD5函数介绍

Oracle 19c的examples静默安装

sqlplus登录缓慢的解决

VMWare 11安装RedHat Linux 7过程中碰到的坑

COST值相同?是真是假?

Oracle 11g的examples静默安装

同名的同义词和视图解惑

v$和v_$的一些玄机

文章分类和索引:

公众号700篇文章分类和索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值