【SQL】常见SQL 行列转换的方法汇总 - 精华版

【SQL】常见SQL 行列转换的方法汇总 - 精华版

  • 一、引言
  • 二、SQL常见的行列转换对比
    • 1. 行转列 Pivoting
      • 1.1 ​​CASE WHEN + 聚合函数​​
      • 1.2 ​​IF + 聚合函数​​
      • 1.3 ​​PIVOT操作符​​
    • 2.列转行 Unpivoting
      • 2.1 UNION ALL​​
      • 2.2 ​​EXPLODE函数(Hive/Spark)​
      • 2.3 ​​UNPIVOT操作符​​
  • 三、对比总结​​
  • ​​四、总结建议​​

一、引言

  • 近期参加了数据岗位的一些面试(如下图:近几年的面试数据),非常多的同学在简历上会写熟悉、精通SQL,但一旦进行原理性(对应数据开发岗)或者实操性(数据分析、数据产品岗)的沟通和测试,往往表现的不尽如人意。所以打算再开一个【SQL】的专栏,分享一些SQL的知识和技巧。
  • SQL专题往期内容:
    • 【SQL】基于多源SQL 去重方法对比 – 精华版
    • 【SQL】常见SQL 行列转换的方法汇总 - 精华版
      在这里插入图片描述

二、SQL常见的行列转换对比

1. 行转列 Pivoting

1.1 ​​CASE WHEN + 聚合函数​​

  • 实现方式​​:CASE条件判断生成新列,配合MAX/SUM等聚合函数处理数据。
  • 优点​​:兼容性强,适用于所有支持SQL的数据库。
  • 缺点​​:列固定时需手动编写大量条件,动态列处理困难。
# 示例
SELECT name,MAX(CASE WHEN skill='语文' THEN 1 ELSE 0 END) AS is_chinese,MAX(CASE WHEN skill='数学' THEN 1 ELSE 0 END) AS is_math
FROM A 
GROUP BY name;# PS:这里要注意,很多同学写的时候直接case when 就结束了,试想一下结束后的数据结构如下
| 姓名 | 是否语文 | 是否数学 |
| 张三 |  1     |   0     | 
| 张三 |  0     |   1     | # 我们需要的行转列后的一条记录,这也是为什么要用聚合函数再处理的原理
| 姓名 | 是否语文 | 是否数学 |
| 张三 |  1     |   1    | 

1.2 ​​IF + 聚合函数​​

  • ​​实现方式​​:类似CASE WHEN,但语法更简洁
  • 优点​​:语法简化,适合少量固定列。
  • 缺点​​:同case ,注意事项同case。
SELECT name,MAX(IF(course='语文', score, 0)) AS chinese
FROM A 
GROUP BY name;

1.3 ​​PIVOT操作符​​

  • 实现方式​​:专用于行转列的语法,需指定聚合函数和转换列。
  • ​​优点​​:语法简洁,逻辑清晰。
  • 缺点​​:仅支持部分数据库(如SQL Server、Oracle),动态列需结合动态SQL。
SELECT * FROM Sales 
PIVOT (SUM(Amount) FOR Month IN ([Jan-22], [Feb-22])) AS PivotTable;

2.列转行 Unpivoting

2.1 UNION ALL​​

  • 实现方式​​:将多列拆分为多个SELECT子查询后合并。
  • ​​优点​​:兼容性好,适用于所有数据库。
  • 缺点​​:代码冗余,列多时维护困难。
SELECT name, '语文' AS subject, is_chinese AS value FROM A WHERE is_chinese = 1
UNION ALL
SELECT name, '数学' AS subject, is_math FROM B WHERE is_math = 1 

2.2 ​​EXPLODE函数(Hive/Spark)​

  • ​​实现方式​​:将数组或拆分后的字符串转换为多行。
  • 优点​​:简洁高效,适合处理数组或分隔字符串。
  • 缺点​​:仅适用于支持EXPLODE的大数据平台(如Hive)。
SELECT name, subject FROM B 
LATERAL VIEW EXPLODE(SPLIT(subject, ',')) tmp AS subject;

2.3 ​​UNPIVOT操作符​​

  • 实现方式​​:专用于列转行的语法。
  • ​​优点​​:语法直观,逻辑清晰。
  • 缺点​​:仅支持部分数据库(如SQL Server)。

# 示例SQL Server
SELECT name, subject, value FROM A
UNPIVOT (value FOR subject IN (is_chinese, is_math)) AS UnpivotTable;

三、对比总结​​

方法适用场景优势劣势
CASE WHEN简单固定列的行转列所有数据库支持,兼容性强代码冗余,动态列处理困难
PIVOT/UNPIVOT支持该语法的数据库语法简洁,逻辑清晰动态列需结合动态SQL,兼容性差
UNION 系列列转行且列数较少所有数据库支持,简单通用代码冗余,维护成本高
EXPLODE大数据平台中的数组或字符串拆分高效简洁环境受限,仅Hive/Spark等

​​四、总结建议​​

类型优先级
行转列​​PIVOT(若数据库支持) > CASE WHEN
​​列转行UNPIVOT / EXPLODE > UNION ALL
动态列处理结合应用层逻辑生成SQL(如Java/Python拼接),或使用存储过程(偏应用场景,故这里不介绍)
  • 具体选择哪种类型实现,需要根据业务场景下,对应的数据库类型、数据量、列是否固定等等因素综合判断,从而选择相对较优的解。

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

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

相关文章

操作系统 4.3-生磁盘的使用

磁盘的物理组成 盘面: 磁盘由多个盘面组成,每个盘面上都有数据存储的区域。 磁道: 每个盘面上都有若干个同心圆,这些同心圆称为磁道。磁道是数据存储的路径。 扇区: 磁道被进一步划分为若干个扇区,扇区…

PT抽ETM如何包含power信息

在primetime中,可以使用extract_model -power指令使ETM包含power的信息。需要注意的是,需要先设置set power_enable_analysis为true。 例如得到有power信息的ETM指令如下(示例): set power_enable_analysis true ex…

Linux服务器网卡深度解析:从ifconfig输出到生产环境性能调优实战

Linux服务器网卡深度解析:从ifconfig输出到生产环境性能调优实战 Linux服务器网卡深度解析:从ifconfig输出到生产环境性能调优实战一、背景二、生产环境的服务器部署情况三、拆解一个真实的 ifconfig 输出1、先看 MAC 地址2、再看设备的 interrupt 和 me…

996引擎-源码学习:PureMVC Lua 中的 Facade 类

996引擎-源码学习:PureMVC Lua 中的 Facade 类 1. 核心概念1.1 外观模式1.2 多例模式2. 关键组件NotificationController:ModelView3. 主要功能4. 初始化流程5. 通信机制6. 生命周期管理1. Facade 初始化流程图2. 发送通知时序图中介者 PlayerBestRingLayerMediatorOpenLayer …

链式多分支规则树模型的应用

目录 开始调用 初始化 欢迎关注我的博客!26届java选手,一起加油💘💦👨‍🎓😄😂 引入 最近在学习一个项目中的链式多分枝规则树模型的使用,模型如下: 如图所…

GitLab之搭建(Building GitLab)

GitLab之搭建 “ 在企业开发过程中,GitLab凭借其强大的版本管理、CI/CD集成和项目管理功能,成为许多团队的首选工具。本文将探讨GitLab的基础介绍、搭建过程、权限管理、代码审查以及团队知识管理等方面。通过详细的步骤和实用的技巧,旨在帮…

蓝桥杯 小蓝的操作(一维差分)

问题描述 一个数组 aa 中共包含 nn 个数,问最少多少次操作,可以让 aa 数组所有数都变成 11 。 操作的内容是:每次操作可以任选一个区间使得区间内的所有数字减 11 。 数据保证一定有解。 输入格式 第一行一个整数 nn 表示有 nn 个整数。 …

C# net CMS相关开源软件 技术选型 可行性分析

C# net CMS相关开源软件 技术选型 可行性分析 OrchardCMS(微软主导) https://github.com/OrchardCMS/OrchardCore https://docs.orchardcore.net/en/latest/ BSD Umbraco-CMS(丹麦) https://github.com/umbraco/Umbraco-CMS https://docs.umbraco.com/…

程序化广告行业(77/89):融资、并购与上市全景洞察

程序化广告行业(77/89):融资、并购与上市全景洞察 大家好呀!一直以来,我都希望能和大家一起在技术知识的海洋里畅游、学习进步。前面我们已经了解了程序化广告行业的发展态势、PC端和移动端投放差异以及行业融资的大致…

【解决方法】VMware 此平台不支持虚拟化Intel VT-x/EPT

目录 1. 引言2. 问题描述3. 解决方法3.1 方法一(临时)3.2 方法二(此方法非常离谱,永久有效) 4. 🤑鼓励一下5. 求关注6. 我的其他文章推荐 1. 引言 收集同学们遇到的各种VMware安装、使用过程中遇到的问题&a…

项目学习总结001

1. 策略模式和工厂模式 https://mp.weixin.qq.com/s/RG-h7r69JyKUlBZylJJIFQ 在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。这就是…

OpenHarmony 5.0版本视频硬件编解码适配

一、简介 Codec HDI(Hardware Device Interface)对上层媒体服务提供视频编解码的驱动能力接口,主要功能有获取组件编解码能力,创建、销毁编解码器对象,启停编解码器操作,编解码处理等。 Codec HDI 2.0接口…

深度解析基于 Web Search MCP的Deep Research 实现逻辑

写在前面 大型语言模型(LLM)已成为我们获取信息、生成内容的重要工具。但它们的知识大多截止于训练数据的时间点,对于需要实时信息、跨领域知识整合、多角度观点比较的深度研究 (Deep Research) 任务,它们往往力有不逮。如何让 LLM 突破自身知识的局限,像人类研究员一样,…

鸿蒙案例---生肖抽卡

案例源码: Zodiac_cards: 鸿蒙生肖抽奖卡片 效果演示 初始布局 1. Badge 角标组件 此处为语雀内容卡片,点击链接查看:https://www.yuque.com/kevin-nzthp/lvl039/rccg0o4pkp3v6nua 2. Grid 布局 // 定义接口 interface ImageCount {url:…

基于RV1126开发板实现自学习图像分类方案

1. 方案简介 自学习:在识别前对物体图片进行模型学习,训练完成后通过算法分类得出图像的模型ID。 方案设计逻辑流程图,方案代码分为分为两个业务流程,主体代码负责抓取、合成图像,算法代码负责训练和检测功能。 2. 快速…

cat命令查看文件行数

在Linux和Unix-like操作系统中,cat命令主要用于查看文件内容,而不是直接用来查看文件行数。如果你想要查看一个文件的行数,可以使用以下几种方法: 方法1:使用wc命令 wc(word count)命令可以用…

git清理已经删除的远程分支

目录 命令作用 使用场景 示例流程 注意事项 常见问题 git remote update origin --prune git remote update origin --prune 是一个 Git 命令,用于 更新本地远程跟踪分支 并 清理(删除)本地已失效的远程分支引用。以下是详细分解&#…

NLP高频面试题(四十)——什么是 BitFit?

BitFit(Bias-term Fine-tuning)是一种参数高效的微调方法,专注于在预训练模型中仅调整偏置项(bias term),而将其他参数保持不变。这种方法在自然语言处理领域,尤其是在中小规模数据集上,展现出了与全量微调相媲美的性能,同时显著减少了计算资源的消耗。 什么是 BitFi…

Java-servlet(完结篇)过滤器乱码解决与监听器

Java-servlet(完结篇)过滤器乱码解决与监听器 前言一、过滤器乱码解决二、监听器1. HttpSessionListener2. ServletContextListener3. ServletRequestListener 三、监听器的使用场景Java-servlet 结语 前言 在之前的 Java Servlet 学习中,我…

为了避免unboundLocalError和为什么X的值一直不变呢?

## 1.为了避免unboundLocalError 发生unboundLocalError! def generate_integer(level):if level 1:X randint(1,9)return X这里出错的原因在于,一旦if 后面的条件没有成立,然后X根本没出生,然后你去使用它,这是有…