当前位置: 代码网 > it编程>数据库>Mysql > MySQL动态列转行的实现示例

MySQL动态列转行的实现示例

2024年11月11日 Mysql 我要评论
介绍​​在实际的数据库查询中,有时候我们需要将表中的动态列(即列数不固定)转换为行,以便更好地进行数据分析和展示。在mysql中,可以通过使用一些技巧和函数来实现动态列转行的功能。本文将介绍怎么实现m

介绍​​

在实际的数据库查询中,有时候我们需要将表中的动态列(即列数不固定)转换为行,以便更好地进行数据分析和展示。在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');

想要的效果:

image

通过 格式化日期+计数函数+分组 实现

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动态列转行内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com