SQL行列转换PIVOT、UNPIVOT

SQL server Pivot函数 行转列效果 需要注意的是,在使用PIVOT函数时,FOR子句中的条件([1]、[2]、[3]、[4])必须是固定的,不能通过参数传入。它可以将行中的某些列值转换为新的列,同时保留其他行的列。行转列指的是将数据行中的某个或某些列的值,转换为新的列,从而实现“一列转多列”的操作。总的来说,这条查询语句利用了SQL Server的内置函数,通过简单的代码实现了行转列的操作,对于需要展示某些列值的情况非常适用。无论使用哪种方法,行转列的操作都可以提高数据概览和分析的效率和效果,并更好地实现数据的可视化和报表展示。 阅读详情

今天看到一篇关于SQL行列转换的文章,感觉很不错,将它整理了一下,转了过来,学习学习

 

PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现

PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P

完整语法:

table_source

PIVOT(

聚合函数(value_column)

FOR pivot_column

IN(<column_list>)

)

 

UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现

完整语法:

table_source

UNPIVOT(

value_column

FOR pivot_column

IN(<column_list>)

)

 

一、行转列

1、建立表格

if object_id('tb')is not null drop tabletb

go

create table tb(姓名 varchar(10),课程 varchar(10),分数 int)

insert into tb values('张三','语文',74)

insert into tb values('张三','数学',83)

insert into tb values('张三','物理',93)

insert into tb values('李四','语文',74)

insert into tb values('李四','数学',84)

insert into tb values('李四','物理',94)

go

select * from tb

go

姓名       课程       分数

---------- ---------- -----------

张三       语文        74

张三       数学        83

张三       物理        93

李四       语文        74

李四       数学        84

李四       物理        94

 

2、使用SQL Server 2000静态SQL

--c

select姓名,

 max(case课程when'语文'then分数else0end)语文,

 max(case课程when'数学'then分数else0end)数学,

 max(case课程when'物理'then分数else0end)物理

fromtb

groupby姓名

姓名       语文        数学        物理

---------- ----------- ----------- -----------

李四        74          84          94

张三        74          83          93

 

3、使用SQL Server 2000动态SQL

--SQL SERVER 2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)

--变量按sql语言顺序赋值

declare @sql varchar(500)

set @sql='select姓名'

select @sql=@sql+',max(case课程when '''+课程+''' then分数else 0 end)['+课程+']'

from(select distinct 课程 from tb)a--同from tb group by课程,默认按课程名排序

set @sql=@sql+' from tb group by姓名'

exec(@sql)

 

--使用isnull(),变量先确定动态部分

declare @sql varchar(8000)

select @sql=isnull(@sql+',','')+' max(case课程when '''+课程+''' then分数else 0 end) ['+课程+']'

from(select distinct课程from tb)asa      

set @sql='select姓名,'+@sql+' from tb group by姓名'

exec(@sql)

姓名       数学        物理        语文

---------- ----------- ----------- -----------

李四        84          94          74

张三        83          93          74

 

4、使用SQL Server 2005静态SQL

select * from tb pivot(max(分数)for课程in(语文,数学,物理))a

 

5、使用SQL Server 2005动态SQL

--使用stuff()

declare @sql varchar(8000)

set @sql=''  --初始化变量@sql

select @sql=@sql+','+课程fromtbgroupby课程--变量多值赋值

set @sql=stuff(@sql,1,1,'')--去掉首个','

set @sql='select * from tb pivot (max(分数) for课程in ('+@sql+'))a'

exec(@sql)

 

--或使用isnull()

declare @sqlvarchar(8000)

–-获得课程集合

select @sql=isnull(@sql+',','')+课程fromtbgroupby课程           

set @sql='select * from tb pivot (max(分数) for课程in ('+@sql+'))a'

exec(@sql)

 

二、列转行

1、建立表格

if object_id('tb') is not null drop table tb

go

create table tb(姓名varchar(10),语文int,数学int,物理int)

insert into tb values('张三',74,83,93)

insert into tb values('李四',74,84,94)

go

select * from tb

go

姓名       语文        数学        物理

---------- ----------- ----------- -----------

张三       74          83          93

李四        74          84          94

 

2、使用SQL Server 2000静态SQL

--SQL SERVER 2000静态SQL。

select*from

(

 select 姓名,课程='语文',分数=语文 from tb

 unionall

 select 姓名,课程='数学',分数=数学 from tb

 unionall

 select 姓名,课程='物理',分数=物理 from tb

) t

orderby 姓名,case 课程when'语文' then 1 when '数学' then 2 when '物理' then 3 end

姓名       课程 分数

---------- ---- -----------

李四       语文 74

李四       数学 84

李四       物理 94

张三       语文 74

张三       数学 83

张三       物理 93

  

2、使用SQL Server 2000动态SQL

--SQL SERVER 2000动态SQL。

--调用系统表动态生态。

declare @sqlvarchar(8000)

select @sql=isnull(@sql+' union all ','')+' select姓名, [课程]='

+quotename(Name,'''')+' , [分数] = '+quotename(Name)+' from tb'

from syscolumns

whereName!='姓名'andID=object_id('tb')--表名tb,不包含列名为姓名的其他列

order by colid

exec(@sql+' order by姓名')

go

 

3、使用SQL Server 2005静态SQL

--SQL SERVER 2005动态SQL

select姓名,课程,分数fromtb unpivot (分数for课程in([语文],[数学],[物理])) t

 

4、使用SQL Server 2005动态SQL

--SQL SERVER 2005动态SQL

declare @sqlnvarchar(4000)

select @sql=isnull(@sql+',','')+quotename(Name)

from syscolumns

whereID=object_id('tb')andNamenotin('姓名')

order by Colid

set @sql='select姓名,[课程],[分数] from tb unpivot ([分数] for [课程] in('+@sql+'))b'

exec(@sql)


 

SQL行列转换 Pivot UnPivot 立即下载

相关推荐

Xilinx Vitis HLS教程1--Vitis HLS概述[01/12]

Xilinx Vitis HLS教程[01/10]前言1. Vitis HLS简介1.1 软件工程师的设计原则1.1.1 简介1.1.2 吞吐量和性能1.2.3 架构问题1.2.4 FPGA编程的3大范式1.2.4.1 生产者-消费者范式1.2.4.2 流式数据范式1.2.4.3 流水线范式1.2.5 3种范式结合 前言 项目中使用到Xilinx Zynq UltraScale+ MPSoC ZCU102 开发板,领导指示研究"xilinx软件自带的c语言综合器"。对于一个硬件一窍不通的我来说,甚至不知道

B10030607的博客 5235

SQL Server行列转换

本文主要分析了SQL Server数据库中行列转换函数PIVOT和UNPIVOT的使用方法。

问心一剑的博客 2万+

vTaskStartScheduler()详解

是启动 FreeRTOS 实时内核的“扳机”。在调用它之前,你只是创建了一些任务结构,但它们都处于“待命”状态,系统仍然在按传统的裸机前后台方式运行。调用这个函数后,FreeRTOS 内核会接管系统的控制权,开始根据优先级调度你创建的任务,多任务环境才真正开始。关键点:它没有参数。它的所有行为都由中的配置宏控制。它通常不会返回。一旦调用,除非没有任务可以运行(或者你显式地停止了调度器),否则程序流永远不会回到main()函数中调用它的下一行。是一个没有参数但行为由精密控制的函数。

Shylock_Mister的博客 1593

sql 列转行(UNPIVOT)

SELECT ProgrectName, 'OverseaSupply' AS Supplier,          MAX(OverseaSupply) AS 'SupplyNum'  FROM ProgrectDetail  GROUP BY ProgrectName  UNION ALL  SELECT ProgrectName, 'NativeSupply' AS Supplie

zhhonglian的专栏 760

Zenoh:统一数据平面协议,重塑物联网与边缘计算架构

在分布式系统与物联网领域,数据通信与处理常面临协议割裂的挑战。传统方案如MQTT、Kafka、gRPC等,分别针对发布/订阅、流处理和RPC等不同场景,导致架构复杂、集成成本高。其核心问题在于未能统一处理“运动中数据”(Data in Motion)与“静止中数据”(Data at Rest)。Zenoh协议通过创新的“Key-Value”寻址与“Selector”查询语言,将发布/订阅、存储、查询和计算四种核心操作融合进单一协议,构建了统一的抽象层。这种设计实现了极低的协议开销(仅5字节头部)和地理分布式

weixin_29597551的博客 290

zemax---光学设计基础概念篇(持续更新中)

光学设计相关知识概念

u011699626的博客 1145

SQL 列值转为行值(unpivot)

qq_35087942的博客 301

一文读懂 CST 时/频域求解器

本文系统介绍了CST Studio Suite中的关键网格技术——六面体网格、四面体网格以及TLM求解器专用的八叉树非均匀网格技术。重点阐述了六面体网格的三项核心技术:理想边界拟合(PBA)技术可精确处理曲面边界,薄片技术(TST)能高效模拟薄层结构,自适应八叉树网格实现计算资源最优分配。同时详细对比了六面体网格与四面体网格的特点及适用场景,前者适用于系统级EMC/EMI分析等时域问题,后者擅长处理复杂曲面和异质材料的频域问题。

一只豌豆象的博客 464

用PIVOT和UNPIVOT实现行列转置

(微软官方解释)FROM - Using PIVOT and UNPIVOT https://msdn.microsoft.com/en-us/library/ms177410.aspx 1、PIVOT列值转置为行 列名为已知值(静态列): create table table1 ( fcompany nvarchar(20) ,fweek nvarchar(20)...

weixin_30650859的博客 287

【C2000系列DSP的Bootloader详解】如何利用脚本自动合并Bin文件

本文通过OutconvertBin.py实现了 C2000 Bootloader+UserApp 的「ELF 转 BIN+BIN 合并」全流程自动化,核心优势如下: 架构适配:严格遵循 C28x 16 位大端格式,生成的 BIN 文件可直接烧录; 自动化程度高:一键完成清理、转换、合并,无需手动执行多个命令; 可追溯性:生成 CRC32 校验值,便于验证文件完整性; 量产友好:合并后的merged.bin支持一次性烧录,提升量产效率。

昔时扬尘处 183

python实现马丁策略(股市) (附完整源码)

python实现马丁策略(股市) (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 603

SQL Server中行列转换 Pivot UnPivot

1.--行列转换 原表:   姓名     科目   成绩            张三     语文    80            张三     数学    90            张三     物理    85            李四     语文

tearsmo的专栏 1380

【Python百日进阶-Web开发-Feffery】Day385 -“一起Dash”训练营Lesson-07_利用fac构建表单(上)

文章目录前言:fac是什么?“人生苦短,我用Python;Web开发,首选Feffery!”↓↓↓ 今日笔记 ↓↓↓一、费老师课堂1.1 什么是表单1.2 页面效果1.3 课堂源码二、课后作业2.1 页面效果2.2 项目源码 前言:fac是什么? feffery-antd-components(简称fac),是国内大佬费弗里(Feffery)老师基于著名的React UI组件库ant design进行二次开发,将ant design中的诸多实用组件及特性引入Dash,帮助开发者使用极低的纯Python代

专注于医院数据分析技术与系统开发的创作与分享。 251

isnull pivot server sql_SQL Server中行列转换 Pivot UnPivot

原标题:SQL Server中行列转换 Pivot UnPivotPIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 请点击此处输入图片描述PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P完整语法:table_sourcePIVOT(聚合函数(value_column)FOR pivot_colum...

weixin_39692045的博客 182

假人有限元模型

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Teradata SQL】行列转换函数PIVOT和UNPIVOT、TD_UNPIVOT

1.行转列函数PIVOT Pivot是用于将行转换为列的关系运算符。该函数对于报告用途很有用,因为它允许您聚合和旋转数据以创建易于读取的表。在SELECT语句的FROM子句中指定PIVOT运算符。对于可以用包含透视运算符的select查询指定的其他子句没有限制。 (1)语法 (2)实例 #数据准备CREATE TABLE star1( country VARCHAR(...

weixin_30527551的博客 1276

STM32F407中文手册

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

isnull pivot server sql_sql server 行列转换PIVOT 和 UNPIVOT | 学步园

PIVOT用于将列值旋转为列名(即行转列),在SQLServer2000可以用聚合函数配合CASE语句实现PIVOT的一般语法是:PIVOT(聚合函数(列)FOR 列 in (…) )AS P完整语法:table_sourcePIVOT(聚合函数(value_column)FOR pivot_columnIN())UNPIVOT用于将列明转为列值(即列转行),在SQLServer 2000可以用...

weixin_39805883的博客 273

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SQL Server 2005之PIVOT/UNPIVOT行列转换

SQL Server2005引入了很多迎合开发者口味的新特性,虽然改动不大,却大大了减少了开发者的工作量,这种替用户考虑的开发思路,值得称赞。在SQL Server2000中,要实现行列转换,需要综合利用聚合函数和动态SQL,实...

congzhan1377的博客 61

sql 行列转换之关键字pivot,unpivot

试用sql关键字pivot与unpivot可以简便快捷实现数据的行列转换。废话不多说,直接上代码,关于它们的语法请自行msdn。 pivot: 创建表StudentScores SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[StudentScores]( [UserName...

abdqcpruwwhyl4931的博客 152

PIVOT/UNPIVOT SQL Server 2005 行列转换

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

2313

SQL Server 行列转换 Pivot UnPivot

PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN() )

纸风车 821

mysql unpivot_SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子...

使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UNPIVOT,则可以很容易的实现行列转换的需求。在本文中我们将通过两个简单的例子详细讲解PIVOT和UNPIVOT的用法。PIVOT是行转列,用法如下:假如表结构如下:id name quarter...

weixin_39516865的博客 799
上一篇: JavaMap集合的遍历
下一篇: Excel重复行删除
draling
博客等级 码龄18年 40粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值