MySQL中实现行列转换的示例

news2024/10/6 12:18:48

在 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.coloradmin.cn/o/1830963.html

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

相关文章

c语言哈夫曼中英文混合编码

一.需求文档 c语言实现哈夫曼编码 1.中文编码 2.英文编码 3.中英文混合编码 4.从文件读取进行编码 5.编码生成编码文件 6.从生成的编码文件进行解码 二.运行截图

香港优才计划中介避坑,深圳哪家优才中介有实力?

随着香港优才计划取消配额限制以来,优才计划递交申请量骤增,许多DIY的申请人在递交申请后,长时间未能收到审批结果,甚至有人等待了12个月之久仍对审批进展一无所知。 而一些有中介协助的申请人,在等待审批的过程中&am…

如何在WIndows虚拟机安装 macOS 黑苹果系统?

在本教程中,我们将介绍如何在虚拟机上安装 macOS 黑苹果系统。黑苹果系统是非苹果公司官方支持的 macOS 系统的非官方版本,可以在普通 PC 上运行。请注意,安装黑苹果系统可能违反苹果的许可协议,请自行承担风险。参考视频教程&…

二、C#基本语法

C#是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型,或者说,是相同的class中。 例如,以rectangle(矩形)对象为例。它具有length和…

有声读物管理平台Booksonic-Air

老苏最近在听评书,所以想找个软件来管理和收听,找了一圈,感觉 Booksonic-Air 可能能满足老苏的需求。 什么是 Booksonic-Air ? Booksonic-Air 是一个用于流式传输有声读物的服务器,是原始 Booksonic 服务器的后继者。…

docker镜像拉取K8s的calico,Pod报错Init:ImagePullBackOff及kubekey生成离线包报错error: Pipeline[ArtifactExportpipe的解决

配置k8s集群出现问题 起初以为是版本问题,最后比对了一下发现没有问题。使用 kubectl describe calico-node-mg9xh -n kube-system命令查看发现docker pull 镜像失败,但是docker国内镜像源早就配置过了。 猜测Docker的缓存可能会导致拉取镜像失败。尝试…

深入探究MySQL的B+树索引

一、索引概述 在MySQL中,索引是一种数据结构,它可以帮助数据库系统更快地检索数据。索引可以比作一本书的目录,它可以让我们不必翻阅整本书就能找到所需的信息。没有索引,MySQL必须从头到尾扫描整个表来找到相关的行,…

Hack The Box-Editorial

总体思路 SSRF->敏感信息泄露->CVE-2022-24439 信息收集&端口利用 nmap -sSVC editorial.htb目标机器开放22、80和1027端口,这里先查看80端口 进去后是一个图书收集界面,对网站进行扫描 dirsearch -u http://editorial.htb逐一访问 about界…

数据分析:微生物组差异丰度方法汇总

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 微生物数据具有一下的特点,这使得在做差异分析的时候需要考虑到更多的问题&…

示例:WPF中应用MarkupExtention自定义IValueConverter

一、目的:应用MarkupExtention定义IValueConverter,使得应用起来更简单和高效 二、实现 public abstract class MarkupValueConverterBase : MarkupExtension, IValueConverter{public abstract object Convert(object value, Type targetType, object …

白酒:茅台镇白酒的配餐建议与味觉体验

茅台镇白酒,以其与众不同的酿造工艺和卓着的品质,成为了中国白酒的代表之一。而云仓酒庄豪迈白酒,作为茅台镇的品牌,其配餐建议与味觉体验备受关注。 在品鉴云仓酒庄豪迈白酒时,配餐的选择对于整体味觉体验至关重要。…

17.零代码八爪鱼采集器数据采集与数据导出——如何导出不同格式数据和数据推送到数据库

首先,多数情况下免费版本的功能,已经可以满足绝大多数采集需求,想了解八爪鱼采集器版本区别的详情,请访问这篇帖子: 3.无代码爬虫八爪鱼采集器工具介绍——个人版本、团队版本的适用性_八爪鱼采集器 有单机版本吗-CSDN…

基于Django的博客系统之增加手机验证码登录(九)

需求文档 概述 实现基于Redis和第三方短信服务商的短信验证码登录功能。用户可以通过手机号码获取验证码,并使用验证码进行登录。 需求细节 用户请求验证码 用户在登录页面输入手机号码并请求获取验证码。系统生成验证码并将其存储在Redis中,同时通过…

二叉树的基础讲解

二叉树在遍历,查找,增删的效率上面都很高,是数据结构中很重要的,下面我们来基础的认识一下。(高级的本人还没学,下面的代码用伪代码或C语言写的)我会从树,树的一些专有名词,树的遍历&#xff0c…

Unity API学习之资源的动态加载

资源的动态加载 在实际游戏开发的更新换代中&#xff0c;随着开发的软件不断更新&#xff0c;我们在脚本中需要拖拽赋值的变量会变空&#xff0c;而要想重新拖拽又太花费时间&#xff0c;因此我们就需要用到Resources.Load<文件类型>("文件名")函数来在一开始…

【尚庭公寓SpringBoot + Vue 项目实战】租约管理(十四)

【尚庭公寓SpringBoot Vue 项目实战】租约管理&#xff08;十四&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】租约管理&#xff08;十四&#xff09;1、业务介绍2、逻辑介绍3、接口开发3.1、保存或更新租约信息3.2、根据条件分页查询租约列表3.3、根据ID查询租…

生成对抗网络——GAN(代码+理解)

目录 一、GAN模型介绍 二、GAN模型的训练过程 1. 初始化网络&#xff1a; 2. 训练判别器&#xff1a; 3. 训练生成器&#xff1a; 4. 重复步骤 2和步骤 3&#xff1a; 三、GAN实现 1. 模型结构 &#xff08;1&#xff09;生成器&#xff08;Generator&#xff09; &a…

动态 ETL 管道:使用非结构化 IO 将 AI 与 MinIO 和 Weaviate 的 Web

在现代数据驱动的环境中&#xff0c;网络是一个无穷无尽的信息来源&#xff0c;为洞察力和创新提供了巨大的潜力。然而&#xff0c;挑战在于提取、构建和分析这片浩瀚的数据海洋&#xff0c;使其具有可操作性。这就是Unstructured-IO 的创新&#xff0c;结合MinIO的对象存储和W…

存储器的分类以及介绍

1.存储器的分类 2.按存储介质分 按照存储介质可以分为三类&#xff0c;电/磁/光 1.半导体存储器&#xff08;电&#xff09; 存储元件由半导体器件组储层的存储器称为半导体存储器。 现代的半导体存储器都是超大规模集成电路工艺制成芯片。 其优点是&#xff1a;体积小、功…

Nature 苏浩团队发表创新人工智能“仿真中学习”框架,实现外骨骼的智能性和通用性

北京时间2024年6月12日23时&#xff0c;美国北卡罗来纳州立大学与北卡罗来纳大学教堂山分校的苏浩团队在《自然》&#xff08;Nature&#xff09;上发表了一篇关于机器人和人工智能算法相结合服务人类的突破性研究论文&#xff0c;标题为“Experiment-free Exoskeleton Assista…