MySQL动态列转行

news2024/11/29 10:48:07

介绍​​

在实际的数据库查询中,有时候我们需要将表中的动态列(即列数不固定)转换为行,以便更好地进行数据分析和展示。在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拼接这种方法可以帮助我们更好地处理动态列的数据,方便进行后续的数据分析和展示。这样就满足我们的场景了。

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

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

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

相关文章

沃比得 DP12A 对数周期天线 100MHz~2GHz

产品概述 DP12A 对数周期天线该天线可用做超短波发射或接收天线,工作频率为 100MHz~2GHz。 具有频带宽,性能可靠,增益高等优点,是理想的无线电频谱管理、EMC 测试、电子对抗等领 域的定向接收、发射天线。 应用领域…

Transformers 加速的一些常用技巧

Transformers 是一个强大的架构,但模型因其采用的自注意力机制,虽然能够有效地处理序列数据并捕获长距离依赖关系,但同时也容易导致在训练过程中出现OOM(Out of Memory,内存不足)或者达到GPU的运行时限制。…

防爆巡检手持终端在燃气巡检作业中的应用

在燃气巡检作业中,安全始终是首要考虑的因素。面对易燃易爆的燃气环境,传统的巡检方式已经难以满足现代安全管理的需求。随着科技的不断进步,防爆巡检手持终端应运而生,成为燃气巡检作业的得力助手。这些终端不仅具备高度的防爆性…

介绍适用于 Node.js 的 Elastic OpenTelemetry 发行版

作者:来自 Elastic Trent Mick 我们很高兴地宣布推出 Elastic OpenTelemetry Distribution for Node.js 的 alpha 版本。 该发行版是 OpenTelemetry Node.js SDK 的轻量级包装,可以让你更轻松地开始使用 OpenTelemetry 来观察 Node.js 应用程序。 背景 …

RiPro主题美化【支付弹窗底部提示语根据入口不同有不同的提示】ritheme主题美化RiProV2 增加支付提示语,按支付类型不同,入口不同提示语不同的设置

RiPro主题美化【支付弹窗底部提示语根据入口不同有不同的提示】ritheme主题美化RiProV2 增加支付提示语,按支付类型不同,入口不同提示语不同的设置 背景: 接上文:https://www.uu2id.com/827.html 付费组件在以下几个地方会弹出:1)文章隐藏内容付费;2)付费资源下载;3…

HR人才测评:应变能力与岗位胜任力素质测评

什么是应变能力 应变能力在职场中可以说是必备的素质之一,它指的是从业者需要长期活动或者是行为来迎接即将到来的挑战,做提前的思考,以适应未来的挑战,具有随机应变的意思。在外界还未发生变化或者是已经发生变化时,…

沃比得DP28A 对数周期天线 200MHz~8GHz

产品概述 DP28A 对数周期天线,工作频率为 200MHz~8GHz。具有频带宽,性能可靠,增益高等优 点,是理想的无线电频谱管理、EMC 测试、电子对抗等领域的定向接收、发射天线。 应用领域 ● 无线电频谱管理 ● EMC 测试 …

(有奖调查)企业级3D模型资产管理平台,用户需求大调查!

(有奖调查)企业级3D模型文件管理平台用户需求大调查https://www.wjx.cn/vm/PpLKkmn.aspx#

作为一名普通投资者怎么查看现货白银的价格是多少?

做现货白银白银投资的投资者,经常会关注现货白银的价格是多少,因为交易决策是建立在具体的价格之上的。那么有什么方法可以让投资者可以时刻关注到现货白银的价格多少呢? 要时刻监测现货白银的价格,我们主要有2种途径,…

IO的阻塞和非阻塞浅析

在操作系统和网络编程中,IO(输入/输出)操作是一个非常重要的概念。 在处理IO的时候,阻塞和非阻塞都是同步IO。只有使用了特殊的API才是异步IO。 ——陈硕大神 网络IO层面 典型的一次IO的两个阶段是什么? 数据准备 和…

大数据项目中的拉链表(hadoop,hive)

缓慢渐变维 拉链表 拉链表,可实现数据快照,可以将历史和最新数据保存在一起 如何实现: 在原始数据增加两个新字段 起始时间(有效时间:什么时候导入的数据的时间),结束时间(默认的结束时间为99…

CUDA-基于累计直方图和共享内存的中值滤波算法

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 基于累计直方图的中值滤波算法详情参见: OpenCV-基于累计直方图的中值滤波算法-CSDN博客 为了进一步提升算…

06、SpringBoot 源码分析 - SpringApplication启动流程六

SpringBoot 源码分析 - SpringApplication启动流程六 初始化基本流程SpringApplication的prepareEnvironment准备环境SpringApplication的getOrCreateEnvironment创建环境configureEnvironment配置环境ApplicationConversionService的getSharedInstance配置转换器 SpringApplic…

C# WinForm —— 17 MaskedTextBox 介绍

1. 简介 本质是文本框,但它可以通过掩码来区分输入的正确与否,可以控制输入的格式、长度 主要应用场景是:需要格式化输入信息的情况 2. 常用属性 属性解释(Name)控件ID,在代码里引用的时候会用到,一般以 mtxt 开头AsciiOnly是否…

Ansible常用变量【下】

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 前言 在上一篇文章《Ansible常用变量【上】》中,学习了Ansible常用变量的前半部分,放了个五一假&#x…

USB转串口芯片CH341、CH372、CH374、CH375等的电路及 PCB 设计的重要注意事项

前言 USB芯片的电路和PCB设计参考及注意事项,含CH34X、CH37X等系列芯片的电路设计说明。涉及工作稳定性和抗干扰以及USB-HOST带电热插拔。基于 USB 芯片的电路及 PCB 设计的重要注意事项 版本:2E 1、摘要 本文主要针对以下因电路及 PCB 设计不佳而引起…

浮点数的由来及运算解析

数学是自然科学的皇后,计算机的设计初衷是科学计算。计算机的最基本功能是需要存储整数、实数,及对整数和实数进行算术四则运算。 但是在计算机从业者的眼中,我们知道的数学相关的基本数据类型通常是整型、浮点型、布尔型。整型又分为int8&a…

点是否在三角形内C++源码实现

原理 思路: 面积和: abc obcaocabo,应该有更简洁的方法,但是这个方法思路更简单 代码实现: 注意二维向量的叉乘后,是垂直于平面的向量,相当于z为0三维向量叉乘,所以只有z维度有值,xy0. flo…

【Nginx <一>⭐️】Nginx 的初步了解以及安装使用

目录 👋前言 👀一、 Nginx 介绍 🌱二、 安装使用 💞️ 三、 总结 📫四、 章末 👋前言 小伙伴们大家好,前段时间主要在学习 Elasticsearch 相关的知识,花了两周的时间吧&#x…

排序-冒泡排序(bubble sort)

冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成…