介绍
在实际的数据库查询中,有时候我们需要将表中的动态列(即列数不固定)转换为行,以便更好地进行数据分析和展示。在mysql中,可以通过使用一些技巧和函数来实现动态列转行的功能。本文将介绍怎么实现mysql动态列转行。
初始表
首先,假设我们有一个表格 users,其中需要动态的列 create_time,我们希望将该列转换为行。下面是一个示例表格的结构:
# 创建用户表 drop table if exists users; create table users ( id int primary key auto_increment comment '主键', username varchar(30) not null comment '用户名', password varchar(30) not null comment '密码', nickname varchar(30) comment '昵称', phone varchar(11) comment '电话号码', create_time datetime default current_timestamp comment '创建时间', update_time datetime default current_timestamp comment '更新时间', is_deleted int default 0 comment '逻辑删除(1:已删除,0:未删除)' ) comment '用户信息表'; # 插入数据 insert into users (username, password, nickname, phone, create_time) values ('admin', 'admin', '张三', '18955554444', '2023-05-01 22:48:11'), ('root', 'root', '李四', '17755624235', '2023-05-02 22:48:11'), ('lisi', 'lisi', '王五', '15989654123', '2023-05-03 22:48:11'), ('lucky', 'lucky', '赵六', '19956852548', '2023-05-04 22:48:11'), ('admin2', 'admin', '张三', '18955554444', '2023-05-01 22:48:11'), ('root2', 'root', '李四', '17755624235', '2023-05-02 22:48:11'), ('lisi2', 'lisi', '王五', '15989654123', '2023-05-01 22:48:11'), ('lucky2', 'lucky', '赵六', '19956852548', '2023-05-01 22:48:11');
想要的效果:
通过 格式化日期+计数函数+分组 实现
select date_format(create_time,'%y/%m/%d') as create_date, count(*) as sum from users group by create_date
执行结果:
显然这并不是我们想要的效果。 这时候就需要用到动态列转行了。
通过 格式日期+求和函数 实现
select sum( date_format( create_time, '%y/%m/%d' ) = '2023/05/01' ) as '2023/05/01', sum( date_format( create_time, '%y/%m/%d' ) = '2023/05/02' ) as '2023/05/02', sum( date_format( create_time, '%y/%m/%d' ) = '2023/05/03' ) as '2023/05/03', sum( date_format( create_time, '%y/%m/%d' ) = '2023/05/04' ) as '2023/05/04' from users
执行结果:
这样就达到我们要的效果了。但是有局限性,如果在加一个日期就需要改sql。
通过 存储过程+分组合并函数+sql拼接 实现
# 设置结束分隔符 delimiter $$ # 判断定义的存储过程是否存在,存在删除,以防存储过程存在报错 drop procedure if exists pro$$ # 创建存储过程 create procedure pro () begin # 定义一个变量 set @sql = null; # 把查询的日期赋给变量 # 这里需要将日期格式化一下, 我要的格式是yyyy/mm/dd, # 而数据给我们的是yyyy-mm-dd hh:mm:ss select group_concat( distinct concat( 'sum(date_format(create_time, \'%y/%m/%d\') = ''', date_format( create_time, '%y/%m/%d' ), ''') as ''', date_format( create_time, '%y/%m/%d' ), '''' ) ) into @sql from users; # 注意:如果运行时报错可以执行 # select @sql; # 检查拼接的sql是否正确 # 拼接sql set @sql = concat( 'select ', @sql, ' from users' ); # 预处理语句 prepare stmt from @sql; # 执行 execute stmt; # 销毁 deallocate prepare stmt; # 结束 end $$ # 调用存储过程 call pro ();
为了方便测试在插入一笔数据
insert into users (username, password, nickname, phone, create_time) values ('test', 'test', 'test', '18955554844', '2023-05-08 22:48:11');
执行结果:
通过动态的sql拼接这种方法可以帮助我们更好地处理动态列的数据,方便进行后续的数据分析和展示。这样就满足我们的场景了。
到此这篇关于mysql动态列转行的实现示例的文章就介绍到这了,更多相关mysql动态列转行内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论