MySQL动态列转行的实现示例

 更新时间:2024年11月10日 11:46:53   作者:#看心情  
本文介绍了如何在MySQL中实现动态列转行的功能,通过使用格式化日期、计数函数、分组、存储过程、分组合并函数和SQL拼接等技巧,可以将动态列转换为行,从而更好地进行数据分析和展示,感兴趣的可以了解一下

介绍​​

在实际的数据库查询中,有时候我们需要将表中的动态列(即列数不固定)转换为行,以便更好地进行数据分析和展示。在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动态列转行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 手把手教你用SQL获取年、月、周几、日、时

    手把手教你用SQL获取年、月、周几、日、时

    时间处理是我们日常开发中经常遇到的需求,下面这篇文章主要给大家介绍了关于如何用SQL获取年、月、周几、日、时的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 详解MySQL中的存储过程和函数

    详解MySQL中的存储过程和函数

    这篇文章主要为大家详细介绍了MySQL数据库中的存储过程和函数的相关操作,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-08-08
  • MySQL索引失效的典型案例

    MySQL索引失效的典型案例

    索引在我们使用MySQL数据库时可以极大的提高查询效率,然而,有时候因为使用上的一些瑕疵就会导致索引的失效,无法达到我们使用索引的预期效果,今天介绍一种MySQL中几种常见的索引失效的原因,可以在以后的工作中尽可能避免因索引失效带来的坑。
    2021-06-06
  • MySQL导出数据遇到secure-file-priv问题的解决方法

    MySQL导出数据遇到secure-file-priv问题的解决方法

    这篇文章主要为大家详细介绍了MySQL导出数据遇到secure-file-priv问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • MySQL数据库下用户及用户权限配置

    MySQL数据库下用户及用户权限配置

    这篇文章主要介绍了MySQL数据库下用户及用户权限配置的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • MySQL中join查询的深入探究

    MySQL中join查询的深入探究

    数据库中的JOIN称为连接,连接的主要作用是根据两个或多个表中的列之间的关系,获取存在于不同表中的数据,下面这篇文章主要给大家介绍了关于MySQL中join查询的深入探究,需要的朋友可以参考下
    2022-11-11
  • Navicat for MySQL 11注册码\激活码汇总

    Navicat for MySQL 11注册码\激活码汇总

    Navicat for MySQL注册码用来激活 Navicat for MySQL 软件,只要拥有 Navicat 注册码就能激活相应的 Navicat 产品。这篇文章主要介绍了Navicat for MySQL 11注册码\激活码汇总,需要的朋友可以参考下
    2020-11-11
  • MySQL中日期和时间戳互相转换的函数和方法

    MySQL中日期和时间戳互相转换的函数和方法

    这篇文章主要介绍了MySQL中日期和时间戳互相转换的函数和方法,本文分别讲解了时间戳转换成日期的方法和把日期转换为时间戳的方法,需要的朋友可以参考下
    2015-06-06
  • MySQL最新版8.1.0版本部署和新特性详解

    MySQL最新版8.1.0版本部署和新特性详解

    MySQL8.1的应该来说是8.0版本的bug修复,这是 MySQL 变更发版模型后的第一个创新版本,本文给大家介绍了MySQL最新版8.1.0版本部署和新特性,需要的朋友可以参考下
    2023-11-11
  • MySQL几种更新操作的案例分析

    MySQL几种更新操作的案例分析

    本文将通过一个用户账户金额更新的案例分析几种数据更新的操作的优劣,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论