MySQL动态列转行

介绍​​

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

执行结果:
在这里插入图片描述
显然这并不是我们想要的效果。 这时候就需要用到动态列转行了。

通过 格式日期+求和函数 实现

SELECTSUM( 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' 
FROMusers

执行结果:
在这里插入图片描述
这样就达到我们要的效果了。但是有局限性,如果在加一个日期就需要改SQL。

通过 存储过程+分组合并函数+SQL拼接 实现

# 设置结束分隔符
DELIMITER $$
# 判断定义的存储过程是否存在,存在删除,以防存储过程存在报错
DROP PROCEDURE IF EXISTS pro$$ 
# 创建存储过程
CREATE PROCEDURE pro () BEGIN# 定义一个变量SET @SQL = NULL;# 把查询的日期赋给变量# 这里需要将日期格式化一下, 我要的格式是yyyy/MM/dd,# 而数据给我们的是yyyy-MM-dd HH:mm:ssSELECTGROUP_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是否正确# 拼接sqlSET @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拼接这种方法可以帮助我们更好地处理动态列的数据,方便进行后续的数据分析和展示。这样就满足我们的场景了。

希望以上内容对您有帮助,欢迎点赞收藏,如有任何疑问或建议,请随时留言。感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升执行力的方法论

2024-5-7记录于PR办公室 一个关于求职的节目,提到如果在一个岗位做了多年,不论你是产品经理或项目经理,是否总结出一套产品/项目/研发的方法论。就这件事,我咨询过一个C语言大师星哥,他是这样说的:一件事在不同的时间段…

Arralist训练之罗马字符转换

1.1.1题目: /*键盘录用一个字符串 要求1.长度小于等于9 要求2.只能是数字 将阿拉伯数字与罗马数字对应 注意的是罗马数字里面没有0 1.1.2思路: 把题目分解成小目标 1.键盘录用一个字符串 2.要求 1.长度小于等于9 2.只能是数字 3.将阿拉伯数字与罗马数字对应…

延时任务通知服务的设计及实现(三)-- JDK的延迟队列DelayQueue

一、接着上文 上文我们讲述了使用redisson的RDelayedQueue实现分布式延迟队列,本文我们将自己JDK的延迟队列DelayQueue实现。 相比前者的实现,作为进程内的延迟队列,它会遇到许多技术难点: 如何支持分布式的多个节点部署场景应…

Android Native内存泄漏检测方案详解

文章目录 1. AddressSanitizer (ASan)2. LeakSanitizer (LSan)3. Valgrind4. 手动检测5. 实践建议6. 总结 在Android Native层开发过程中,内存泄漏是一个常见的问题。内存泄漏不仅会导致应用程序占用越来越多的内存,还可能引发性能问题和崩溃。因此&…

Game Theory In Competitive Programming|Part2(原创)

在上一个Part部分,我们介绍了Bash game、Nim game、Misere Nim game 这三个游戏的玩法、必胜策略,以及必胜策略的证明,并介绍了有关必胜态以及必败态的两条定理,接下来我们会以Part1为基础,深挖其中的理论。 文章目录 …

【Oracle直播课】5月19日Oracle 19c OCM认证大师课 (附课件预览)

Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) 部分课件预览 OCM部分课件预览 Oracle Database 19c Certified Master Exam (OCM) 认证大师 25 天 / 150课时 什么是Oracle 19c OCM? Oracle Certified Master (OCM)是Oracle认证大师,…

如何使用 iOS系统恢复软件修复 iPhone 问题

苹果公司向世界推出了他们可以拥有的最智能的手机。但即使是 iPhone 也无法避免智能手机常见的损坏和问题。您将熟悉最常见的问题。屏幕黑屏或卡在 Apple 徽标上;冻结或卡在恢复模式的 iPhone。但这样的问题不胜枚举,每天都有 iOS 用户在他们的设备中遇到…

利用傅里叶变换公式理解camera raw中的纹理和清晰度的概念(可惜的是camera raw的计算公式应该不会是这个傅里叶变换,只能说类似于这里的效果)

知乎说:在Adobe官方的解释中,就像图片可以分解成彩色通道(如:红绿蓝通道),同样的,图片也可以分解成不同的频率,一张图片可以是由高频,中频和低频组成,例如&am…

VALSE 2024年度进展评述内容分享-视觉基础大模型的进展

2024年视觉与学习青年学者研讨会(VALSE 2024)于5月5日到7日在重庆悦来国际会议中心举行。本公众号将全方位地对会议的热点进行报道,方便广大读者跟踪和了解人工智能的前沿理论和技术。欢迎广大读者对文章进行关注、阅读和转发。文章是对报告人…

docker安装redis命令及运行

docker安装redis: docker run -d -p 6379:6379 --name redis redis:latest -d: 以 守护进程模式 运行容器,容器启动后会进入后台运行,并脱离当前命令行会话。 -p: 显示端口号。 -p 6379:6379: 将容器内部的 6379 端口映射到宿主机 6379 端…

Redis学习3——Redis应用之缓存

引言 缓存的意义 Redis作为一个NoSql数据库,被广泛的当作缓存数据库使用,所谓缓存,就是数据交换的缓冲区。使用缓存的具体原因有: 缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘&a…

实现拖拽功能的实战示例

以下是一个简单的用JavaScript实现拖拽功能的示例&#xff1a; HTML代码&#xff1a; <!DOCTYPE html> <html> <head><title>拖拽示例</title><style>#draggable {width: 100px;height: 100px;background-color: red;position: absolute…

2024年第十三届工程与创新材料国际会议(ICEIM 2024)即将召开!

2024年第十三届工程与创新材料国际会议&#xff08;ICEIM 2024&#xff09;将于2024年9月6-8日在日本东京举行。ICEIM 2024由东京电机大学主办&#xff0c;会议旨在材料科学与工程、材料特性、测量方法和应用等相关领域进行学术交流与合作&#xff0c;在材料的微观世界里&#…

APP产品中如何引入PGC?

这是一篇10年前的文章&#xff0c;但我觉得即便过去这么久了&#xff0c;文章内的方法还是具有普适性的。刊发在此&#xff0c;希望能对读者有所帮助。 问题&#xff1a;社区里怎么引入一些专业的意见领袖&#xff0c;并让这些领袖每天发布专业性的内容&#xff0c;吸引普通的…

npm install 及使用cordova打包常见错误大全(附解决方案)

问题1、cb() 这是我们在install过程中最最常见问题&#xff0c;网络上的解决方式也都是大同小异&#xff0c;要么就是升级node(误人子弟)&#xff0c;项目里的node是不可以随意升级的&#xff0c;它有可能会导致其他依赖又不适配&#xff0c;起始很多时候就是由于咱们配置的镜像…

【docker】常用的Docker编排和调度平台

常用的Docker编排和调度平台 Kubernetes (K8s): Kubernetes是目前市场上最流行和功能最全面的容器编排和调度平台。它由Google开发并开源&#xff0c;现由CNCF&#xff08;云原生计算基金会&#xff09;维护。Kubernetes设计用于自动化容器部署、扩展和管理&#xff0c;支持跨…

v-for中的key是什么作用

在使用v-for进行列表渲染时&#xff0c;我们通常会给元素或者组件绑定一个key属性。 这个key属性有什么作用呢?我们先来看一下官方的解释&#xff1a; key属性主要用在Vue的虚拟DOM算法&#xff0c;在新Inodes对比时辨识VNodes&#xff1b; 如果不使用key&#xff0c;Vue会使用…

计算机系列之信息安全技术

15、信息安全技术 1、信息安全和信息系统安全 信息安全系统的体系架构 X轴是“安全机制”&#xff0c;为提供某些安全服务&#xff0c;利用各种安全技 术和技巧&#xff0c;所形成的一个较为完善的机构体系。 Y轴是“OSI网络参考模型”。 Z轴是“安全服务”。就是从网络中的各…

uniapp引入vant组件库

在 UniApp 中引入 Vant 组件库的完整步骤通常如下&#xff1a; 安装 Vant&#xff1a; 首先&#xff0c;你需要通过 npm 或 yarn 安装 Vant。打开项目的根目录&#xff0c;然后在命令行中执行以下命令&#xff1a; 使用 npm&#xff1a; npm install vant 或者使用 yarn&…

Spring框架学习笔记(一):Spring基本介绍(包含容器底层结构)

1 官方资料 1.1 官网 https://spring.io/ 1.2 进入 Spring5 下拉 projects, 进入 Spring Framework 进入 Spring5 的 github 1.3 在maven项目中导入依赖 <dependencies><!--加入spring开发的基本包--><dependency><groupId>org.springframework<…