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

news2025/4/18 9:20:59

【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.coloradmin.cn/o/2332814.html

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

相关文章

【原创】vue-element-admin-plus完成确认密码功能,并实时获取Form中表单字段中的值

前言 我第一句就想说:vue-element-admin-plus真是个大坑货!就一个确认密码功能都值得我单开一页博客来讲这么一个简单的功能 布局和代码 布局如图所示,我需要密码和确认密码,确认密码需要和密码中的内容一致,不然会返…

MySQL---数据库基础

1.数据库概念 文件保存数据有以下几个缺点: 文件的安全性问题 文件不利于数据查询和管理 文件不利于存储海量数据 文件在程序中控制不方便 数据库存储介质: 1.磁盘 2.内存 为了解决上述问题,设计出更加利于管理数据的东西 —— 数据库。…

leetcode68.左右文本对齐

思路源自 leetcode-字符串篇 68题 文本左右对齐 难度高的模拟类型题目,关键点在于事先知道有多少单词要放在本行并且还要知道本行是不是最后一行(最后一行需要全部单空格右对齐,不是最后一行就空格均摊),非最后一行的空…

若依微服务集成Flowable仿钉钉工作流

项目简介 本项目工作流模块集成在若依项目单独一个模块,可实现单独运行部署, 前端采用微前端,嵌入在若依的前端项目中。因博主是后端开发,对前端不是太属性,没将工作流模块前端代码移到若依前端。下面贴上代码工程结构…

MySQL 架构设计:数据库的“城市规划指南“

就像一座完美城市需要精心的规划才能高效运行,一个优秀的 MySQL 系统也需要精心的架构设计才能支撑业务的发展…让我们一起探索 MySQL 的"城市规划",学习如何设计一个既高效又稳定的数据库王国! 什么是 MySQL 架构设计&#xff1f…

【从0到1学MybatisPlus】MybatisPlus入门

Mybatis-Plus 使用场景 大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国…

依靠视频设备轨迹回放平台EasyCVR构建视频监控,为幼教连锁园区安全护航

一、项目背景 幼教行业连锁化发展态势越发明显。在此趋势下,幼儿园管理者对于深入了解园内日常教学与生活情况的需求愈发紧迫,将这些数据作为提升管理水平、优化教育服务的重要依据。同时,安装监控系统不仅有效缓解家长对孩子在校安全与生活…

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配置外部中断参数 插入一个小知识——如何正确的配置结构体? 初始化中断&#…

docker的安装使用0废话版本自学软硬件工程师778天

见字如面, 这里是AIGC创意人_竹相左边 上一篇 因为 自己开发客户系统,为了解决一键启动 前端后端,涉及到了docker-compose 在新的电脑上安装docker 有各种问题这里再次记录下,既是笔记也是分享。 我先用自己的话说一遍&#xff0…

探秘 Svelte+Vite+TS+Melt - UI 框架搭建,开启高效开发

框架太“重”了:通常一个小型项目只由少数几个简单页面构成,如果使用 Vue 或者 React 这些框架来研发的话,有点“大材小用”了。构建的产物中包含了不少框架运行时代码(虚拟 DOM、响应式、状态管理等),这些代码对于小型项目而言是…

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、人类遥控(用…

专题|MATLAB-R语言Logistic逻辑回归增长模型在互联网金融共生及移动通信客户流失分析实例合集

全文链接:https://tecdat.cn/?p41343 作为数据科学家,我们始终关注如何通过模型创新揭示复杂系统的动态规律。本专题合集聚焦两大核心应用场景,通过 Logistic 增长模型与逻辑回归技术,为互联网金融共生演化与移动通信客户流失预警…

【学生管理系统升级版】

学生管理系统升级版 需求分析:注册功能:登录功能:验证码规则:忘记密码: 实操:系统主页面注册功能登录功能忘记密码效果演示 需求 为学生管理系统书写一个登陆、注册、忘记密码的功能。     只有用户登录成功之后&…

Web3 的云基础设施正在成型,Polkadot 2.0 用三项技术改写“上链成本”

在Web3基础设施内卷加剧的今天,“如何以更低成本、更大灵活性部署一条高性能应用链”正成为开发者们最关心的问题。而刚刚走出“技术慢热”误区的Polkadot,正在用一套名为 Polkadot 2.0 的架构升级方案,重新定义这一问题的解法。 这套升级最…

机器学习——ROC曲线、PR曲线

一、ROC曲线简介 1.1 ROC曲线的构成 1.横轴(假正率,FPR): 表示负样本被错误分类为正的比例(越小越好) 2.纵轴(真正率,TPR,即召回率): 表示正样…

我为女儿开发了一个游戏网站

大家好,我是星河。 自从协助妻子为女儿开发了算数射击游戏后,星河就一直有个想法:为女儿打造一个专属的学习游戏网站。之前的射击游戏虽然有趣,但缺乏难度分级,无法根据女儿的学习进度灵活调整。而且,仅仅…