【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拼接),或使用存储过程(偏应用场景,故这里不介绍) |
- 具体选择哪种类型实现,需要根据业务场景下,对应的数据库类型、数据量、列是否固定等等因素综合判断,从而选择相对较优的解。
相关文章:
【SQL】常见SQL 行列转换的方法汇总 - 精华版
【SQL】常见SQL 行列转换的方法汇总 - 精华版 一、引言二、SQL常见的行列转换对比1. 行转列 Pivoting1.1 CASE WHEN 聚合函数1.2 IF 聚合函数1.3 PIVOT操作符 2.列转行 Unpivoting2.1 UNION ALL2.2 EXPLODE函数(Hive/Spark&#…...
【原创】vue-element-admin-plus完成确认密码功能,并实时获取Form中表单字段中的值
前言 我第一句就想说:vue-element-admin-plus真是个大坑货!就一个确认密码功能都值得我单开一页博客来讲这么一个简单的功能 布局和代码 布局如图所示,我需要密码和确认密码,确认密码需要和密码中的内容一致,不然会返…...
Vue3中watch监视reactive对象方法详解
在Vue3中,使用watch监视reactive对象时,需根据监视的目标选择合适的方法。以下是详细的步骤和说明: 1. 监视整个reactive对象 自动深度监视:直接监视reactive对象时,Vue3会默认启用深度监视,无需设置deep:…...
PyTorch实现多输入输出通道的卷积操作
本文通过代码示例详细讲解如何在PyTorch中实现多输入通道和多输出通道的卷积运算,并对比传统卷积与1x1卷积的实现差异。 1. 多输入通道互相关运算 当输入包含多个通道时,卷积核需要对每个通道分别进行互相关运算,最后将结果相加。以下是实现…...
MySQL---数据库基础
1.数据库概念 文件保存数据有以下几个缺点: 文件的安全性问题 文件不利于数据查询和管理 文件不利于存储海量数据 文件在程序中控制不方便 数据库存储介质: 1.磁盘 2.内存 为了解决上述问题,设计出更加利于管理数据的东西 —— 数据库。…...
leetcode68.左右文本对齐
思路源自 leetcode-字符串篇 68题 文本左右对齐 难度高的模拟类型题目,关键点在于事先知道有多少单词要放在本行并且还要知道本行是不是最后一行(最后一行需要全部单空格右对齐,不是最后一行就空格均摊),非最后一行的空…...
若依微服务集成Flowable仿钉钉工作流
项目简介 本项目工作流模块集成在若依项目单独一个模块,可实现单独运行部署, 前端采用微前端,嵌入在若依的前端项目中。因博主是后端开发,对前端不是太属性,没将工作流模块前端代码移到若依前端。下面贴上代码工程结构…...
MySQL 架构设计:数据库的“城市规划指南“
就像一座完美城市需要精心的规划才能高效运行,一个优秀的 MySQL 系统也需要精心的架构设计才能支撑业务的发展…让我们一起探索 MySQL 的"城市规划",学习如何设计一个既高效又稳定的数据库王国! 什么是 MySQL 架构设计?…...
【从0到1学MybatisPlus】MybatisPlus入门
Mybatis-Plus 使用场景 大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国…...
依靠视频设备轨迹回放平台EasyCVR构建视频监控,为幼教连锁园区安全护航
一、项目背景 幼教行业连锁化发展态势越发明显。在此趋势下,幼儿园管理者对于深入了解园内日常教学与生活情况的需求愈发紧迫,将这些数据作为提升管理水平、优化教育服务的重要依据。同时,安装监控系统不仅有效缓解家长对孩子在校安全与生活…...
【简单理解什么是简单工厂、工厂方法与抽象工厂模式】
一、简单工厂模式 1.简单工厂模式 通过一个工厂类集中管理对象的创建 ,通过参数决定具体创建哪个对象。 #适合对象类型较少且变化不频繁的场景,缺点是违反开闭原则(新增产品需修改工厂类) 开闭原则(对扩展开放对修改关闭) :当…...
DeepSeek和文心一言的区别
文章目录 1.开发公司:2.应用场景:3.训练数据:4.模型架构:5.技术特点:6.语言风格:7.开源性:8.界面与用户体验: 1.开发公司: DeepSeek 由杭州深度求索人工智能基础技术研究…...
HOW - React Developer Tools 调试器
目录 React Developer Tools使用Components 功能特性1. 查看和编辑 props/state/hooks2. 查找组件3. 检查组件树4. 打印组件信息5. 检查子组件 Profiler 功能特性Commit ChartFlame Chart 火焰图Ranked Chart 排名图 why-did-you-render 参考文档: React调试利器&a…...
STM32F103C8T6单片机开发:简单说说单片机的外部GPIO中断(标准库)
目录 前言 如何使用STM32F1系列的标准库完成外部中断的抽象 初始化我们的GPIO为输入的一个模式 初识GPIO复用,开启GPIO的复用功能时钟 GPIO_EXTILineConfig和EXTI_Init配置外部中断参数 插入一个小知识——如何正确的配置结构体? 初始化中断&#…...
Oracle序列介绍
文章目录 Oracle序列介绍1. Oracle序列演进2. Oracle序列使用3. Oracle身份列(自增列)4. Oracle序列常见使用与问题 Oracle序列介绍 1. Oracle序列演进 Oracle序列(Sequence)是数据库生成唯一数值序列的对象,主要用于…...
docker的安装使用0废话版本自学软硬件工程师778天
见字如面, 这里是AIGC创意人_竹相左边 上一篇 因为 自己开发客户系统,为了解决一键启动 前端后端,涉及到了docker-compose 在新的电脑上安装docker 有各种问题这里再次记录下,既是笔记也是分享。 我先用自己的话说一遍࿰…...
探秘 Svelte+Vite+TS+Melt - UI 框架搭建,开启高效开发
框架太“重”了:通常一个小型项目只由少数几个简单页面构成,如果使用 Vue 或者 React 这些框架来研发的话,有点“大材小用”了。构建的产物中包含了不少框架运行时代码(虚拟 DOM、响应式、状态管理等),这些代码对于小型项目而言是…...
3D数据共享标准——GLB文件格式揭秘
GLB 文件格式:跨平台 3D 数据共享的标准 简介 在这个数据爆炸的时代,3D 数据因其直观、逼真的特点而得到广泛应用。然而,不同 3D 软件和平台之间的兼容性一直是一个难题。 为了解决这一问题,GLB 文件格式应运而生。作为一种标准…...
微信小程序事件绑定基本语法
微信小程序使用 bind 或 catch 前缀绑定事件,语法如下: <组件 bind事件名"处理函数" catch事件名"处理函数"></组件> bind:事件绑定,允许事件冒泡(向父组件传递)。 catc…...
页面编辑器CodeMirror初始化不显示行号或文本内容
延迟刷新 本来想延迟100毫秒的,但是会出现样式向左偏移的情况,于是试了试500毫秒,发现就没有问题了,可能是样式什么是需要一个加载过程吧。 useEffect(() > {editorRef.current?.setValue(value || );setTimeout(() > {edi…...
vscode 连不上 Ubuntu 18 server 的解决方案
下载 vscode 历史版本 18.5(windows请装在 系统盘 C 盘) 打开 vdcode,将 自动更新 设置为 None (很关键,否则容易前功尽弃) 重命名(删除) 服务器上的 .vscode-server 文件夹 重新…...
云原生运维在 2025 年的发展蓝图
随着云计算技术的不断发展和普及,云原生已经成为了现代应用开发和运维的主流趋势。云原生运维是指在云原生环境下,对应用进行部署、监控、管理和优化的过程。在 2025 年,云原生运维将迎来更加广阔的发展前景,同时也将面临着一系列…...
Redis进阶--哨兵
目录 一、引言 二、介绍 三、哨兵的核心功能 四、使用docker进行单个主机redis主从复制哨兵操作 五、哨兵重新选取主节点的流程 1.主观下线 2.客观下线 3.主节点挂了 4.挑选新主节点 六、总结 一、引言 如果主从复制中,主节点挂了,从节点会迷茫…...
Franka 机器人x Dexterity Gen引领遥操作精细任务新时代
教授机器人工具灵活操作难题 在教授机器人灵活使用工具方面,目前主要有两种策略:一是人类遥控(用于模仿学习),二是模拟到现实的强化学习。然而,这两种方法均存在明显的局限性。 1、人类遥控(用…...
UE5 RPC调用示例详解
文章目录 前言一、示例场景二、代码实现三、关键点解析3.1 RPC类型选择3.2 可靠性设置3.3 权限控制3.4 输入处理 四、测试与验证总结 前言 在UE5中,RPC(远程过程调用)是实现多人游戏逻辑同步的核心机制。以下通过一个玩家跳跃的示例…...
专题|MATLAB-R语言Logistic逻辑回归增长模型在互联网金融共生及移动通信客户流失分析实例合集
全文链接:https://tecdat.cn/?p41343 作为数据科学家,我们始终关注如何通过模型创新揭示复杂系统的动态规律。本专题合集聚焦两大核心应用场景,通过 Logistic 增长模型与逻辑回归技术,为互联网金融共生演化与移动通信客户流失预警…...
从零构建一个全栈AI应用:Next.js + FastAPI + OpenAI API
💡 为什么写这篇文章? 很多开发者希望构建一个能“聊天、问答、调用AI能力”的完整应用,但在前端、后端、模型接口之间打通时,常常踩坑。 今天这篇文章将手把手教你如何从零构建一个 AI 全栈应用: 前端用 Next.js 构…...
idea里面不能运行 node 命令 cmd 里面可以运行咋回事啊
idea里面不能运行 node 命令 cmd 里面可以运行咋回事啊 在 IntelliJ IDEA(或其他 JetBrains 系列 IDE)中无法运行某些命令,但在系统的命令提示符(CMD)中可以正常运行,这种情况通常是由于以下原因之一导致的…...
Dify 生成提示词的 Prompt
Dify 生成提示词的 Prompt **第1次提示词****第2次提示词****第3次提示词**总结 Dify 生成提示词是,会和LLM进行3次交互,下面是和LLM进行交互是的Prompt。 以下是每次提示词的概要、目标总结以及原始Prompt: 第1次提示词 概要: …...
ocr python库
ocr python库 上手Git、Gitee和Github!watt toolkit...
