Mysql一维表转二维表,动态的行转列

背景

想利用Grafana做数据展示,将一维的长表优化成二维数据表格展示。

将一维表转换为二维表,也就是将行转换为列,可以使用MySQL的PIVOT语句来完成。

PIVOT是一种在关系型数据库中将行转换为列的技术。在MySQL中,可以使用PIVOT语句将普通的查询结果转换为一个带有动态列的表格。

PIVOT语句通过将行的值转换为列的值来重新排列数据。在MySQL中,PIVOT语句通常使用聚合函数(如SUM、MAX、MIN等)来对数据进行汇总,以便在转换后的表格中每个单元格只有一个值。

假设条件

假设我们有一个名为“orders”的表,其中存储了订单的信息,包括订单号、商品名称和商品数量:

CREATE TABLE orders (order_id INT,product_name VARCHAR(50),quantity INT
);

现在,我们想将这个一维表转换为二维表,其中每列都代表一个商品名称,每行都代表一个订单,数量为该订单中该商品的数量。

实际两种处理情况

若是要转换成的二维表的表头是已知固定的,则为静态转换
若是要转换成的二维表的表头是不确定的,根据数据动态增加,则为动态转换

静态转换

SELECT order_id,MAX(CASE WHEN product_name = 'Product A' THEN quantity END) AS 'Product A',MAX(CASE WHEN product_name = 'Product B' THEN quantity END) AS 'Product B',MAX(CASE WHEN product_name = 'Product C' THEN quantity END) AS 'Product C'
FROM orders
GROUP BY order_id;

或者使用IF判断

SELECT order_id,Sum(if(product_name = 'Product A',quantity,0)) AS 'Product A',Sum(if(product_name = 'Product B',quantity,0)) AS 'Product B',Sum(if(product_name = 'Product C',quantity,0)) AS 'Product C',
FROM orders
GROUP BY order_id;

聚合函数(SUM、MAX、MIN)可以根据需要替换

动态转换

使用动态SQL生成PIVOT语句的具体实现方法可以根据您的具体情况而定,常用以下两种方式:

  • 使用存储过程:可以编写一个存储过程,该存储过程接受列名称作为输入参数,并使用动态SQL生成PIVOT语句。存储过程可以将查询结果作为参数返回,并将结果集转换为带有动态列的表格。这种方法的好处是可以将查询逻辑封装在存储过程中,使代码更加模块化和可重用。

  • 使用预处理语句:可以编写一个包含动态列名称的字符串,并在MySQL中使用预处理语句来执行动态SQL。这种方法的好处是可以将查询逻辑与数据分离,并且可以减少SQL注入的风险。

存储过程方式

  1. 创建一个存储过程,该存储过程接受列名称作为输入参数,并使用动态SQL生成PIVOT语句。以下是一个示例:
DELIMITER $$
CREATE PROCEDURE pivot_sales(IN col_name VARCHAR(50))
BEGINSET @cols = (SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN ', col_name, ' = ''', REPLACE(val, '''', ''''''), ''' THEN amount END) AS ''', REPLACE(val, '''', ''''''))) FROM salesCROSS JOIN (SELECT DISTINCT val FROM sales WHERE col_name = 'region') r;SET @query = CONCAT('SELECT date, ', @cols, ' FROM sales GROUP BY date');PREPARE stmt FROM @query;EXECUTE stmt;DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

说明:DEALLOCATE PREPARE语句用于释放由PREPARE语句占用的资源。在MySQL中,PREPARE语句用于准备动态SQL,并将其存储在MySQL服务器的缓存中。当不再需要动态SQL时,可以使用DEALLOCATE PREPARE语句来释放缓存中的语句,以释放资源并减少内存使用。

说明:DELIMITER是MySQL中的一个命令,它用于更改SQL语句的结束符号(通常为分号)。在默认情况下,MySQL使用分号作为SQL语句的结束符号。但是,当在存储过程或函数中使用多条SQL语句时,分号可能会被解释为SQL语句的结束符号,从而导致语法错误。

为了避免这个问题,可以使用DELIMITER命令更改SQL语句的结束符号,例如将结束符号更改为$$。这样,使用分号作为SQL语句的内部结束符号不会与外部SQL语句的结束符号冲突。

在使用DELIMITER命令时,应该首先使用DELIMITER命令设置新的结束符号,然后编写SQL语句,并使用新的结束符号结束SQL语句。最后,应该使用DELIMITER命令将结束符号更改回原始值。

  1. 调用存储过程并将列名称作为参数传递。以下是一个示例:
CALL pivot_sales('region');

存储过程中的动态SQL可能会导致SQL注入的风险,因此应该谨慎使用,并确保输入的列名称是可信的。

预处理语句方式(常用)

SET @cols = (SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN region = ''', region, ''' THEN sales END) AS ', region)) FROM sales);SET @query = CONCAT('SELECT date, ', @cols, ' FROM sales GROUP BY date');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

在这个示例中,我们使用了MySQL的GROUP_CONCAT函数来动态生成列名称,然后使用CONCAT函数将列名称与PIVOT语句组合在一起。最后,我们使用PREPARE语句来准备动态SQL并使用EXECUTE语句来执行动态SQL。

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

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

相关文章

QTableWidget setSortingEnable 函数使用详解

Qt助手的解释 If enable is true, enables sorting for the table and immediately trigger a call to sortByColumn() with the current sort section and order Note: Setter function for property sortingEnabled. 如果将 enable 设置为 true 那么就会立即调用 sortByColum…

Election of the King 2023牛客暑期多校训练营4-F

登录—专业IT笔试面试备考平台_牛客网 题目大意:有一个n个数的数组a,有n-1轮操作,每轮由每个数选择一个和它的差最大的数,如果相同就选值更大的,被最多数组选择的数字被删去,有相同的也去掉数值更大的那个…

使用Appuploader工具将IPA上传到App Store的最新流程和步骤

​ 苹果官方提供的工具xcode上架ipa非常复杂麻烦。用appuploader 可以在 mac 和windows 上制作管理 证书 ,无需钥匙串工具 条件:1.以Windows为例,创建app打包ios需要的证书和描述文件 2.准备好一个苹果开发者账号(如果没有到苹果…

Kubernetes(K8s)从入门到精通系列之六:K8s的基本概念和术语之存储类

Kubernetes K8s从入门到精通系列之六:K8s的基本概念和术语之存储类 一、存储类二、emptyDir三、hostPath四、公有云Volume五、其他类型的Volume六、动态存储管理一、存储类 存储类的资源对象主要包括: VolumePersistent VolumePVCStorageClass基础的存储类资源对象——Volum…

Vue.js与ASP.NET的结合,实现企业级应用的开发和部署

在当今快速发展的互联网技术领域,企业级应用的开发和部署变得越来越重要。Vue.js和ASP.NET是两个在前端和后端开发中广泛使用的技术,将它们结合起来可以为企业级应用的开发和部署带来诸多优势。本文将通过代码示例介绍如何使用Vue.js和ASP.NET进行企业级…

matlab使用教程(5)—矩阵定义和基本运算

本博客介绍如何在 MATLAB 中创建矩阵和执行基本矩阵计算。 MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言,数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形,在这种意义上沿任何维度的分量向量的长度…

C++ 类和对象篇(一) 类的引入

目录 一、类的概念 二、类的引入 三、类的定义 1.定义一个类 2.struct 和 class 的区别 3.类中成员函数的声明、实现分离 四、封装及类的访问限定符 1.封装 2.类的访问限定符 五、类的作用域和生命周期 六、类的实例化 七、类存储方法 八、计算类的大小 一、类的概念 1…

大盗阿福(记忆化搜索板子)

提供核心代码:(经典的记忆化搜索套路) int dfs(int pos){if(f[pos]!-1) return f[pos];//记忆化if(pos>n) return 0;//边界,越界int sum0;//模板int f10,f20;f1dfs(pos1);f2dfs(pos2)w[pos];summax(f1,f2);//模板f[pos]sum;//模…

TypeScript基础篇 - TS模块

目录 模块的概念 Export 语法(default) Export 语法(non-default) import 别名 Type Export语法【TS】 模块相关配置项:module【tsconfig.json】 模块相关配置项:moduleResolution 小节总结 模块的…

Unity 多语言问题C#篇

DateTime.ToString()不同语言环境问题 问题描述:PlayerPrefs.SetString("timeKey", DateTime.Now.ToString());切换系统语言后DateTime.Parse(PlayerPrefs.GetString("timeKey"));报错FormatException: String was not recognized as a valid D…

动态内存管理面试题

动态内存管理面试题 文章目录 动态内存管理面试题一、第一题此代码存在的问题运行结果分析原因修改 二、第二题此代码存在的问题运行结果分析原因修改 一、第一题 代码如下&#xff08;示例&#xff09;&#xff1a; #include<stdio.h> #include<string.h> #incl…

数据结构:顺序表详解

数据结构&#xff1a;顺序表详解 一、 线性表二、 顺序表概念及结构1. 静态顺序表&#xff1a;使用定长数组存储元素。2. 动态顺序表&#xff1a;使用动态开辟的数组存储。三、接口实现1. 创建2. 初始化3. 扩容4. 打印5. 销毁6. 尾插7. 尾删8. 头插9. 头删10. 插入任意位置数据…

《MySQL 实战 45 讲》课程学习笔记(三)

事务隔离 事务就是要保证一组数据库操作&#xff0c;要么全部成功&#xff0c;要么全部失败。 隔离性与隔离级别 事务特性&#xff1a;ACID&#xff08;Atomicity、Consistency、Isolation、Durability&#xff0c;即原子性、一致性、隔离性、持久性&#xff09;。当数据库上…

php 抽象工厂模式

1&#xff0c;抽象工厂&#xff08;Abstract Factory&#xff09;模式&#xff0c;是创建设计模式的一种&#xff0c;它创建一系列相关的对象&#xff0c;而不必指定具体的类。该模式为一个产品族提供了统一的创建接口。当需要这个产品族的某一系列的时候&#xff0c;可以为此系…

Intel和AMD 与 x86,ARM,MIPS有什么区别?

先说amd和intel amd和Intel这俩公司的渊源很深&#xff0c;早期时Intel先是自己搞了个x86架构&#xff0c;然后amd拿到了x86的授权也可以自己做x86了。接着intel向64位过渡的时候自己搞了个ia64&#xff08;x64架构&#xff09;但是因为和x86架构不兼容市场反应极差&#xff0…

100行代码写一个简易QT点名程序

照例演示一下: 分享一个简易的Qt点名程序&#xff0c;满打满算一百行代码&#xff08;还要什么自行车&#xff09;。 UI界面比较丑&#xff0c;按钮是自己做的&#xff0c;背景是AI作画生成的&#xff0c;大家可以自行更换背景以及按钮。 内容也是非常的简单&#xff0c;就是…

代码随想录算法训练营day46

文章目录 Day46单词拆分题目思路代码 Day46 单词拆分 139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 题目 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明&#xff1a; 拆…

Jmeter接口/性能测试,Jmeter使用教程(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、线程组 线程组…

代码随想录算法训练营第二十二天 | 读PDF复习环节2

读PDF复习环节2 本博客的内容只是做一个大概的记录&#xff0c;整个PDF看下来&#xff0c;内容上是不如代码随想录网站上的文章全面的&#xff0c;并且PDF中有些地方的描述&#xff0c;是很让我疑惑的&#xff0c;在困扰我很久后&#xff0c;无意间发现&#xff0c;其网站上的讲…

Modbus tcp转ETHERCAT网关modbus tcp/ip协议

捷米JM-ECT-TCP网关能够连接到Modbus tcp总线和ETHERCAT总线中&#xff0c;实现两种不同协议设备之间的通讯。这个网关能够大大提高工业生产的效率和生产效益&#xff0c;让生产变得更加智能化。捷米JM-ECT-TCP 是自主研发的一款 ETHERCAT 从站功能的通讯网关。该产品主要功能是…