数据库之 case关键字和 pivot使用,行列转换实现

SQL PIVOT 原理与实战:高效实现行列转换与报表优化 行列转换是数据分析中将长格式数据重构为宽格式视图的基础能力,其核心原理在于分组、聚合与列名映射的确定性三步操作。相比手工编写冗长的 CASE WHEN,PIVOT 以声明式语法显著提升 SQL 可维护性、执行效率与类型安全性,尤其适用于固定维度报表生成、BI 数据服务构建及金融风控等强一致性场景。它并非黑箱魔法,而是关系代数层面的结构重排机制,在 SQL Server 中原生支持,PostgreSQL 和 MySQL 则需借助 crosstab() 或 GROUP_CONCAT 等替代方案。掌握 PIVOT 阅读详情

首先数据表为;

create TABLE S_score2(
	 id int PRIMARY KEY,
	姓名 char(10),
	课程 char(10) ,
	分数 int
);

insert into S_score2 
values(1, '张三', '语文' , 89),
(2, '张三', '数学' , 98),
(3, '张三', '英语' , 77),
(4, '李四', '语文' ,  90),
(5, '李四', '数学' ,  90);
  • 查询出来:
    在这里插入图片描述
要求:
  • 查询结果如下:
    在这里插入图片描述
    我们会采用 case 字段名 when 字段值 then 字段名代表的字段值 end
    来完成, 参考文章:
    比较易懂, 详细的信息
分析:
  • 一。 首先我们知道, 数学,语文等, 是原表的 字段值, 我们需要查询出来,作为字段名,所以要构造这些字段名
select 姓名,
			CASE 课程 
				when '语文' then 分数 else 0 end as 语文,
			CASE 课程 
				when '数学' then 分数 else 0 end as 数学,
			CASE 课程 
				when '英语' then 分数 else 0 end as 英语

from S_score2;
  • 结果:
    在这里插入图片描述
  • 分析
    • 1.我们select 查询语句后面构造出来了我们想要的字段
    • 2 当程序遍历(select) 原表(S_score2) 中的每一条记录时,按照我们的思路去输出结果
      • 首先 有一个 名字 字段
      • 然后 进入第一个 case字段,通过 课程字段的值,如果是 ‘语文’ ,那么就给它的结果 是 对应本条记录 分数字段的 值, 如果不是 ‘语文’,那么 这个字段的值,就给 0.
      • 后面的 数学, 英语 相同
    • 这样执行也就出现了 每条记录都有 语文,数学, 英语三个字段了。
  • 二。下一步,根据我们初步的结果,只需要使用聚合函数 SUM,就可以得到综合的结果,应为 对应的每条记录都是 0,只有一个字段有值。
select 姓名,
			sum(CASE 课程 
				when '语文' then 分数 else 0 end) as 语文,
			sum(CASE 课程 
				when '数学' then 分数 else 0 end) as 数学,
			sum(CASE 课程 
				when '英语' then 分数 else 0 end) as 英语

from S_score2 group by(姓名);
  • 这样就能得到正确的结果了!
    在这里插入图片描述

    问题二:已有横表 如何转化为列

insert into S_score1 
values(1, '张三', 90 , 89 , 70),
(2, '李四', 91 , 80 , 88);


select * from S_score1;

在这里插入图片描述

解决: 使用 集合操作 union, 资料111页,交并差操作。
select 姓名,
 '语文' as 课程,
 语文 as 分数
 from S_score1
 union all
  select 姓名,
 '数学' as 课程,
 数学 as 分数
 from S_score1
 union all
  select 姓名,
 '英语' as 课程,
 英语 as 分数
 from S_score1

 order by 姓名 desc;
  • 集合操作需要注意:
    union 会自动去掉重复的元素,而 union all 不会。
    在这里插入图片描述

到这里就先结束吧~

SQL行转列实战指南:从CASE WHEN到动态Pivot全解析 行转列(Rows to Columns)是SQL数据透视的核心技术,本质是聚合函数与分组逻辑的协同编排,而非简单字段映射。其底层原理基于条件聚合(如CASE WHEN)或引擎原生PIVOT算子,技术价值在于将长表结构转化为宽表视图,显著提升业务报表可读性与BI工具兼容性。典型应用场景包括销售按产品线拆分、用户行为按事件类型统计、医疗指标按检查项目归类等。本文聚焦SQL Pivot与动态列两大热词,覆盖MySQL、PostgreSQL、SQL Server、Oracle四大引擎的落地差异,提供无需存储过程的纯 阅读详情

相关推荐

MySQL 8.0 行列转换实战:3种方法对比与5个性能优化点

本文详细对比了MySQL 8.0中三种行列转换方法(CASE WHEN、SUM(IF)和PIVOT模拟)的性能差异,并提供了5个实战验证的性能优化技巧。通过索引设计、避免全表扫描、控制输出列数量等优化点,帮助开发者在处理大规模数据时提升SQL查询效率,特别适用于报表生成和数据透视分析场景。

weixin_30219613的博客 304

CASE WHEN

case when作用及用途

qq_20018925的博客 657

掌握SQL中列转行的两种方法

本文还有配套的精品资源,点击获取 简介:在数据处理与报表制作中,将列转成行是常见的操作,称为行列转换。本文将介绍两种实现这一转换的方法:一种是使用 UNION ALL 结合 CASE WHEN 语句,另一种是利用数据库系统支持的 PIVOT 功能。前者需要多个 SELECT 语句组合和适当的聚合函数来实现,后者则直接使...

weixin_33245447的博客 2197

sql 行转列

case when 与 pivot

qq_42807253的博客 4121

Oracle数据库实战:横表到纵表的高效转换技术详解

横表是指多列记录同一类属性的不同取值,而纵表则是将这类属性及其对应的取值展开为多行记录。例如,一张横表可能包含员工ID、项目1成绩、项目2成绩等多个字段,而在纵表中,每个项目及对应成绩会被拆分为独立的行记录。横表到纵表的转换是数据库处理中的常见任务,Oracle提供了丰富的原生功能以及灵活的方法来实现这一目标。熟练掌握这些技巧有助于提升数据处理能力和效率,进而更好地服务于数据分析和报表生成等工作场景。

gongjin28_csdn的博客 2798

ArcMap新手必看:Shape属性中的点ZM值到底是什么?如何快速处理

本文深入解析ArcMap中Shape属性中的点ZM值,揭示其在GIS数据中的隐藏维度作用,包括Z值(高程值)和M值(测量值)。针对ZM值可能引发的服务发布问题,提供三种高效处理方案,帮助新手快速掌握数据导入时的ZM值管控策略及精准去除方法。

weixin_42561476的博客 431

Oracle中pivot函数详解

pivot函数格式:pivot(聚合函数 for 需要转为列的字段名 in(需要转为列的字段值)); pivot函数说明:实现将指定字段的值转换为列的效果。

实泽有之,无泽虚之 3万+

1.2 固态变压器:传统工频变压器的局限与SST的技术起源

本小节明确传统工频变压器在电力系统中的基础定位与核心工作特性,系统分析其在新型电力系统场景下的固有技术瓶颈,梳理固态变压器(Solid State Transformer, SST,又称电力电子变压器Power Electronic Transformer, PET)从概念提出到工程化成熟的完整演进路径,为后续SST技术优势、设计需求与规范符合性要求的讲解建立底层逻辑,同时对应GB/T 40429-2021《电力电子变压器通用技术要求》的需求制定背景。

技术工作者 656

SQL Server数据库月份统计数据-PIVOT函数的使用

sql server PIVOT函数的使用 1-12分月统计数据,其中月份没有数据也展示出来。

xin292930540的专栏 1778

在MacBook M1/M2上,手把手教你打包包含嵌入模型的RagFlow Docker镜像(避坑指南)

本文详细指导如何在MacBook M1/M2上构建ARM64架构的RagFlow Docker镜像,涵盖环境准备、依赖处理、镜像构建及性能优化全流程。特别针对Apple Silicon芯片的兼容性问题提供解决方案,帮助开发者高效完成本地开发环境搭建。

weixin_26908317的博客 241

快速了解Spyder

一 面板介绍菜单栏:放置所有功能工具栏:放置快捷菜单,可以通过菜单栏中的View的Toolbars的复选框来勾选工作区:写代码的地方属性页的标题栏:可以显示当前代码的名字和位置查看栏:查看文件、调试时的对象及变量输出栏:查看程序的输出信息,也可以作为shell终端来输入Python语句状态栏:用来显示当前文件权限、编码,光标指向位置和系统内存二 注释功能注释功能为编写代码很常用功能,下面介绍Spy...

实践求真知 1万+

SQL SERVER 行转列 PIVOT 用法及解释

在数据库操作过程中,偶尔会使用到《行转列》查询;下面介绍Sql server 中常用的行转列操作; 1.语法 PIVOT用于将列值旋转为列名(即行转列),在SQL Server2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column)FOR pivot_column IN (<column_lis...

冰零界点 1万+

一篇NS SAR ADC的学习记录

一篇NS SAR ADC的学习记录 内容包含: OverSampling Noise Shaping Dynamic Amplifier DAC with Redundancy 最近看了些有意思的SAR ADC结构,但是因为确实对模拟这个领域不太熟,导致了一系列的级联查找,最终达到了一个大概能懂的状态,为了理清思路,顺便别让看了这么些天的东西浪费了,还是计划写篇文章。 ps:由于不是一篇特别正紧的报告,参考文献就写的比较随便,且我还是个做数字的 A 13.5-ENOB, 107-μW Noise-Sha

weixin_45669724的博客 8708

Oracle 数据塑形:行列转换与集合运算

报表要求的数据格式总是千奇百怪?其实用SQL就能让数据轻松“变形”。想把多行内容(比如各科成绩)合并成一行里的多列,可以用经典的CASE WHEN,或者在11g以上版本里用更简洁的PIVOT。反过来,把宽表拆成多行,也有UNION ALL和更方便的UNPIVOT。学会这些,再配合UNION、INTERSECT等集合运算,数据就能随心所欲地展示了。

专注于 Agent 工程、AI 产品、Harness Engineering、LLM 算法等方向,OpenMathModel、Nivik 等开源项目作者 6万+

14、多级快速多极子算法(MLFMA)详解

多级快速多极子算法(MLFMA)是一种高效加速矩阵向量乘法(MVM)的数值方法,广泛应用于电磁场积分方程求解中。该算法通过构建多级树结构,将MVM分解为近场直接计算和远场分组计算两部分,利用递归聚类、聚合-平移-分解三阶段处理远场相互作用,并结合采样、模式计算与优化策略,将计算复杂度从O(N^2)降低至O(N log N)。博文详细阐述了MLFMA的核心步骤、数学推导、计算复杂度及实际应用中的优化技术,如伽辽金方案改进、对称性利用和反插值方法,为大规模电磁问题的高效求解提供了系统性指导。

t8u9v0w1x的博客 241

14、方法论 - 自顶向下与自底向上的结合

本文探讨了如何将自顶向下的规范驱动方法与自底向上的组件构建方法相结合,以形成更加全面的编程理论。通过引入代数法则,简化逻辑关系、提高代码可读性并支持形式化验证,结合实际案例(如智能家居控制系统)展示了如何在设计和实现阶段确保系统的正确性和可靠性。文章还讨论了工具支持的重要性,并提出了未来发展的方向。

lstm7chronicler的博客 173

SQL行列转换实战:从CASE WHEN到PIVOT/UNPIVOT的完整指南

在数据处理领域,数据透视与逆透视是重塑数据结构、适配不同分析场景的核心技术。其原理是通过聚合函数配合条件逻辑,或利用集合操作,实现行与列之间的相互转换。这项技术的价值在于能够高效整合分散数据、满足报表展示需求,并优化下游数据应用接口。无论是构建汇总报表、准备机器学习特征,还是对接异构系统,行列转换都是数据工程师和数据分析师的必备技能。本文将深入解析条件聚合与UNION ALL等基础实现方案,并探讨在动态列处理、多列组合等复杂场景下的实战技巧,帮助读者应对日常开发中的各类数据重塑挑战。

weixin_31102231的博客 249

A*寻路算法的最简单通俗讲解

为什么我的眼里常含泪水?因为我有一个算法不会。为了节约点眼泪,今天我们就来介绍著名的A*寻路算法(或简称A*算法)。 Peter Hart, Nils Nilsson 和 Bertram Raphael 在1968年首次提出了著名的A*算法。A*算法其实是Dijkstra最短路径算法的一种扩展。不一样的是,在A*算法中我们需要使用Heuristics 来导引搜索过程,以期达到更好的表现。 ...

白马负金羁 2万+

oracle 行列对应,Oracle行列互换 横表和纵表

/*在实际使用sql工作中总会碰到将某一列的值放到标题中显示.就是总说的行列转换或者互换.比如有如下数据:ID NAME KECHENG CHENGJI-- ---------- -------------------- -------1 a 语文 802 a 数学 ...

weixin_42398171的博客 580

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

sql pivot使用_您是否正在使用SQL PIVOT? 你应该!

sql pivot使用 有时,我们会遇到这些罕见SQL问题,在这些问题中我们想做一些看起来与众不同的事情。 这些事情之一就是将行旋转到列。 瓦利安特(Valiante) 最近对堆栈溢出问题提出了确切的要求。 从此表: +------+------------+----------------+-------------------+ | dnId | propNameId | prop...

danpu0978的博客 189

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

使用 PIVOT 和 UNPIVOT

使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UNPIVOT,则可以很容易的实现行列转换的需求。 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个

冰的城 735

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

SQL行转列实战指南:PIVOT与CASE动态聚合全解析

行转列(Pivot)是将长表数据按维度折叠为宽表的关键技术,其本质是分组聚合与值映射的协同过程。底层依赖条件聚合(如SUM+CASE)实现跨数据库兼容,而原生PIVOT则提供更高性能但牺牲可移植性。该技术直接支撑BI可视化、下游系统对接及报表自动化等核心场景,尤其在电商、零售、金融等领域,面对动态品类、多时间粒度和NULL语义等现实约束时,需权衡静态编码与动态SQL方案。本文聚焦SQL Pivot与条件聚合两大主流路径,结合跨库适配、性能调优与生产避坑,提供可直接落地的工程化解决方案。

weixin_33736832的博客 519

Oracle 篇之行列转换

Oracle 行列转换的方式

qq_45650716的博客 1071

PIVOT/UNPIVOT SQL Server 2005 行列转换

1. ================================================= http://untitled.spaces.live.com/blog/cns!86b82838704e0d5a!783.entry 微软SQL Server 2005语法增强之PIVOT 使用 PIVOT 和 UNPIVOT 可以使用 PIVOT 和 UNPIVOT 关系运...

爱.NET 120

简单数据库设计

数据库设计 学生表:student 字段: studentnum(学号),studentname(学生姓名),classname(班级名称),sex(男:1,女:2),birthday(出生日期) 问题1:查出student表中各个班级的人数,并按人数从多到少排列 答案: SELECT classname,COUNT(classname) FROM student GROUP BY classname ORDER BY COUNT(classname) DESC 注意:GROUP BY分组,OR

Zhang5801的博客 1976

SQL 横表和纵表的转换

横表就是普通的建表方式,如一个表结构为: 主键、字段1、字段2、字段3。。。 如果变成纵表后,则表结构为: 主键、字段代码、字段值。 而字段代码则为字段1、字段2、字段3。  具体为电信行业的例子。以用户帐单表为例一般出账时用户有很多费用客户,其数据一般存储为:时间,客户ID,费用科目,费用。这种存储结构一般称为纵表,其特点是行数多,字段少。 纵表在使用时由于行数多,统计用户数或对用户进行分档时还...

LZQDYY的博客 1万+
上一篇: 触发器的实践运用
下一篇: 关于 mysql 数据库中 删除重复数据
我是py呀
博客等级 码龄8年 205粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值