mysql行数据转为列数据
最近在开发过程中遇到问题,需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示。
借此机会,在网上查阅了相关方法,现总结出一种比较简单易懂的方法备用。
普通查询
select id, data_time, numfrom testwhere id = 1order by data_time;
运行结果:
行数据转为列数据
当我们想把id为1的数据按照时间排列在一行,那么这时候就需要用到group by了,当然了,这里用的函数不一定是sum
select id, sum(if(date_format(DATA_TIME, '%H:%i') = '11:23', num, null)) as d1, sum(if(date_format(DATA_TIME, '%H:%i') = '11:24', num, null)) as d2, sum(if(date_format(DATA_TIME, '%H:%i') = '11:25', num, null)) as d3from testgroup by id;
查询结果:
总结
可以看出,这里行转列是将原来的data_time字段的多行内容选出来,作为结果集中的不同列,并根据id进行分组显示对应的num;
注意点:
SUM()是为了能够使用GROUP BY根据id进行分组,因为每一个id对应的data_time=‘某个时间’ 的记录只有一条,所以SUM()的值就等于对应那一条记录的num的值。
假如id=1 和data_time=‘某个时间’ 的记录有两条,则此时SUM()的值将会是这两条记录的和,同理,使用Max()的值将会是这两条记录里面值最大的一个。但是正常情况下,一个id对应一个时间段下的数据只有一个,因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函数都可以达到行转列的效果。
建表语句
-- auto-generated definitioncreate table test( id int not null, data_time datetime not null, num int null);
数据语句
INSERT INTO `test`(`id`, `data_time`, `num`) VALUES (1, '2023-06-20 11:24:00', 1);INSERT INTO `test`(`id`, `data_time`, `num`) VALUES (1, '2023-06-20 11:25:00', 54);INSERT INTO `test`(`id`, `data_time`, `num`) VALUES (1, '2023-06-20 11:23:00', 5234);
来源地址:https://blog.csdn.net/qq_44275015/article/details/131469080
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341