MySQL中实现行列转换的示例

在 MySQL 中进行行列转换(即,将某些列转换为行或将某些行转换为列)通常涉及使用条件逻辑和聚合函数。虽然 MySQL 没有像 Oracle/SQL Server 中的 PIVOT 和 UNPIVOT 那样的直接功能,但你可以通过结合 CASE 语句、UNION 或 UNION ALL、以及 GROUP BY 等来实现这些转换。

1、行转列的操作

在 MySQL 中,并没有内置的 PIVOT 函数,如 Oracle/SQL Server 中那样。但是,你可以使用条件聚合或 CASE 语句来模拟 PIVOT 操作。

以下是一个简单的示例,说明如何在 MySQL 中模拟 PIVOT。

假设你有一个名为 t_sales 的表,它记录了销售数据,结构如下:

CREATE TABLE t_sales (  
    id int primary key auto_increment,
    col_year INT,  
    product VARCHAR(255),  
    amount DECIMAL(10, 2)  
);  
  
INSERT INTO t_sales (col_year, product, amount) VALUES  
(2020, 'A001', 100),  
(2020, 'B001', 120),  
(2021, 'A001', 150),  
(2021, 'B001', 150),
(2022, 'A001', 260),  
(2022, 'B001', 240),
(2023, 'B001', 330),
(2024, 'A001', 440);

(root@localhost:mysql.sock)[superdb 10:49:26]>select * from t_sales;
+----+----------+---------+--------+
| id | col_year | product | amount |
+----+----------+---------+--------+
|  1 |     2020 | A001    | 100.00 |
|  2 |     2020 | B001    | 120.00 |
|  3 |     2021 | A001    | 150.00 |
|  4 |     2021 | B001    | 150.00 |
|  5 |     2022 | A001    | 260.00 |
|  6 |     2022 | B001    | 240.00 |
|  7 |     2023 | B001    | 330.00 |
|  8 |     2024 | A001    | 440.00 |
+----+----------+---------+--------+
8 rows in set (0.00 sec)

现在,假设你想要将产品列 (product) 转换为列标题,并为每个年份和产品显示销售额。在 Oracle/SQL Server 中,你可以使用 PIVOT 来实现这一点。但在 MySQL 中,你可以这样做:

SELECT   
    col_year,  
    SUM(CASE WHEN product = 'A001' THEN amount ELSE 0 END) AS 'A_product',  
    SUM(CASE WHEN product = 'B001' THEN amount ELSE 0 END) AS 'B_product'  
FROM t_sales
GROUP BY col_year;

(root@localhost:mysql.sock)[superdb 10:50:29]>SELECT   
    ->     col_year,  
    ->     SUM(CASE WHEN product = 'A001' THEN amount ELSE 0 END) AS 'A_product',  
    ->     SUM(CASE WHEN product = 'B001' THEN amount ELSE 0 END) AS 'B_product'  
    -> FROM t_sales
    -> GROUP BY col_year;
    
-- 这将返回以下结果
+----------+-----------+-----------+
| col_year | A_product | B_product |
+----------+-----------+-----------+
|     2020 |    100.00 |    120.00 |
|     2021 |    150.00 |    150.00 |
|     2022 |    260.00 |    240.00 |
|     2023 |      0.00 |    330.00 |
|     2024 |    440.00 |      0.00 |
+----------+-----------+-----------+
5 rows in set (0.00 sec)

这就是在 MySQL 中模拟 PIVOT 的方法。对于更复杂的转换或更多的产品,你可能需要扩展 CASE 语句来包含更多的条件。

2、列转行的操作

在 MySQL 中,没有直接的 UNPIVOT 操作,因为 UNPIVOT 是 SQL Server 和 Oracle 等数据库系统中的功能,用于将多列转换为多行。但是,你可以使用 MySQL 的查询技巧来模拟 UNPIVOT 操作。

假设你有一个类似 PIVOT 后的结果集,并且你想要将其转换回原始的多行格式,你可以使用 UNION ALL 或 UNION(取决于是否要消除重复行)来模拟 UNPIVOT。

以下是一个示例,说明如何在 MySQL 中模拟 UNPIVOT 操作:

假设你有一个 t_pivoted_sales 表,它是通过 PIVOT(或上述的 MySQL 模拟方法)得到的:

CREATE TABLE t_pivoted_sales (  
    id int primary key auto_increment,
    col_year INT,  
    A_product DECIMAL(18, 2),  
    B_product DECIMAL(18, 2)  
);  
  
INSERT INTO t_pivoted_sales (col_year, A_product, B_product) VALUES  
(2020, 100.00, 120.0),  
(2021, 150.00, 150.00),
(2022, 260.00, 240.00),
(2023, 0.00, 330.00),
(2024, 440.00, 0.00);

(root@localhost:mysql.sock)[superdb 11:02:54]>select * from t_pivoted_sales;
+----+----------+-----------+-----------+
| id | col_year | A_product | B_product |
+----+----------+-----------+-----------+
|  1 |     2020 |    100.00 |    120.00 |
|  2 |     2021 |    150.00 |    150.00 |
|  3 |     2022 |    260.00 |    240.00 |
|  4 |     2023 |      0.00 |    330.00 |
|  5 |     2024 |    440.00 |      0.00 |
+----+----------+-----------+-----------+
5 rows in set (0.00 sec)

现在,你想要将 A_product 和 B_product 列转换回多行格式,其中有一个额外的列product来表示产品(A_product 或 B_product)。你可以使用以下查询来模拟 UNPIVOT:

SELECT col_year, 'A_product' AS product, A_product AS amount FROM t_pivoted_sales
union all
SELECT col_year, 'B_product' AS product, B_product AS amount FROM t_pivoted_sales
order by col_year;

这将返回以下结果
在这里插入图片描述

这就是在 MySQL 中模拟 UNPIVOT 操作的方法。通过为每个你想要“unpivot”的列创建一个 SELECT 语句,并使用 UNION ALL 将它们组合在一起,你可以得到期望的多行格式结果。

**** 欢迎点赞收藏及评论交流,万分感谢!****

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux下Shell脚本基础知识

主要参考视频: 这可能是B站讲的最好的Linux Shell脚本教程,3h打通Linux-shell全套教程,从入门到精通完整版_哔哩哔哩_bilibili 主要参考文档: Shell 教程 | 菜鸟教程 (runoob.com) Bash Shell教程 (yiibai.com) 先用视频入门&…

银行数仓项目实战(一)--什么是数据仓库

文章目录 数据仓库特点目的:监管报送监管报送的系统主要有?监管报送报送的数据 OLTP和OLAP 架构 数据仓库 数据仓库是一个面向主题的,集成的,非易失的且随时间变化的数据集合,用来支持管理人员的决策。 数据仓库是一个…

采集罗克韦尔AB、西门子等PLC数据发布成HTTP接口

智能网关IGT-DSER集成了多种PLC的原厂协议,方便实现各种PLC的原厂协议转换为HTTP协议的服务端,通过网关的参数配置软件绑定JSON文件的字段与PLC寄存器地址,即可接收来自客户端的GET、PUT和POST命令,解析和打包JSON文件(JSON文件格…

两个链表合并升序-链表题

21. 合并两个有序链表 - 力扣(LeetCode) 非递归 class Solution { public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {if(list1 nullptr && list2 ! nullptr)return list2;if(list2 nullptr && list1 ! nullptr)re…

电子传真怎么在国产系统上使用?一文看懂网络传真信创方案

国产化浪潮正在逐步深入,越来越多的企业开始关注如何在国产系统上高效、安全地使用办公软件,电子传真系统也不例外。 作为网络电子传真领域的重要品牌,EastFax也对原Windows电子传真系统进行了信创改造,全面支持国产化操作系统、…

取证工作: SysTools SQL Log Analyzer, 完整的 SQL Server 日志取证分析

天津鸿萌科贸发展有限公司是 Systools 系列软件的授权代理商。 SysTools SQL Log Analyzer 是 Systools 取证工具系列之一,用于调查 SQL Server 事务日志,以对数据库篡改进行取证分析。 什么是 SQL Server 事务日志? 在深入研究 SQL 事务日…

【工作】计算机行业相关的十六类工作简介

本文简单介绍了计算机行业相关的工作类别,共16种,包括常见招聘要求与平均工资。平均工资信息来源:米国企业点评职场社区glassdoor(https://www.glassdoor.com/index.htm) (一)软件工程师 软件…

【机器学习】图神经网络:深度解析图神经网络的基本构成和原理以及关键技术

🔥 个人主页:空白诗 文章目录 引言一、图数据及其应用场景1.1 图数据的定义和特征1.2 常见的图数据结构1.2.1 社交网络1.2.2 知识图谱1.2.3 分子结构1.2.4 交通网络 1.3 图数据在不同领域的应用实例1.3.1 社交网络中的推荐系统1.3.2 知识图谱中的信息检索…

流量卡怎么办理的攻略

一、确定需求 在办理流量卡之前,你需要明确自己的需求。根据不同的使用场景,你可能需要考虑以下几个方面: 月租费用:不同运营商提供的流量卡套餐价格各异,从低至19元到高达199元不等。 流量大小:从30GB到3…

ChromeDriver新手教程:一步步指导Chrome 114到127版本的驱动安装

114之前版本下载链接在这里 ​​​​​​125以后版本下载链接在此,只有后面status是绿色对勾的才可以下载,驱动大版本一致就可以使用,不需版本号一模一样;下载所需版本只需点击对应的版本名称即可跳转到对应版本的下载位置。 以…

同三维T80004JEH2-4K60 双路4K60 HDMI解码器

输出:2路HDMI2路3.5音频,最高支持1路4K60HDMI输出 可以同源/独立分屏输出两种模式可选:对应两个HDMI输出一样和不一样的信号 同源可以解码36路网络流(1/4/9/16/25/36),两个HDMI输出一样的信号&#xff…

《骑行健身:“柳叶刀”研究揭示的健康与经济双赢策略》

在这个物价飞涨、经济压力日益加重的时代,普通人如何在不增加额外负担的情况下提升生活质量?《柳叶刀》的最新研究为我们揭开了一个意想不到的秘密:坚持健身,尤其是骑行,竟等同于每年为自己赚取了一笔不小的财富。这一…

表格识别工具哪个好?简单操作,一键识别表格

随着2024年高考的圆满结束,考生们迎来了新的挑战——志愿填报。这不仅是一个技术活,更是一个信息战。 面对海量的高校信息和复杂的数据表格,考生们需要一种快速、准确的方法来整理和分析这些数据。幸运的是,现代科技提供了多种表…

【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)

🔥引言 本篇将深入解析单链表:探索底层逻辑,理解底层是如何实现并了解该接口实现的优缺点,以便于我们在编写程序灵活地使用该数据结构。 🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 &…

【软件测试入门】软件测试那些事

在日常生活中,我们早已习惯于各类软件带来的便捷与效率,从手机里的应用程序到电脑上的办公软件,它们无声地编织着现代社会的运作网络。然而,每一款流畅运行、体验优良的软件背后,都离不开一个关键环节——软件测试。《…

同三维T80004EH-N HDMI高清NDI编码器

1路HDMI 1路3.5音频输入,支持NDI 产品简介: 同三维T80004EH-N 高清HDMI编码器是专业的NDI高清音视频编码产品,该产品支持1路高清HDMI音视频采集功能,1路3.5MM独立音频接口采集功能。编码输出双码流H.265/H.264格式,音频MP3/AAC格…

SRM供应商管理系统建设方案及源码实现(方案+源码)

1. 供应商管理 2. 采购需求管理 3. 采购寻源管理 4. 采购合同管理 5. 采购订单管理 6. 采购协同管理 7. 外部商城采购管理 8. 报表查询管理 9. 系统管理 10. 集成管理 资料获取:本文末个人名片。

免费分享一套SpringBoot+Vue房地产销售管理系统【论文+源码+SQL脚本+PPT+开题报告】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue房地产销售管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue房地产销售管理系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue房地产销售管理系统 Java毕业设计…

【解决方案】数据采集工作站数据传不上去?

数据采集工作站扮演着至关重要的角色,它们负责收集、处理和传输各种传感器和设备的数据。然而,有时会遇到数据传输失败的问题。本文将详细探讨数据采集工作站数据传不上去的可能原因及其解决方案。(更多了解采集器设备可前往苏州稳联&#xf…

【Android】安卓开发的前景

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…