SQL Server行列转换

这篇具有很好参考价值的文章主要介绍了SQL Server行列转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在使用SQL Server数据库的过程中我们经常会遇到需要将行数据和列数据相互转换显示的问题。对于这个问题SQL Server数据库有专门的内置函数PIVOT(行转列)、UNPIVOT(列转行)可以解决。下面我们就来分析一下这两个函数的使用方法。

一、行转列PIVOT

1、语法

select * from 源表名 as 表别名
pivot( 聚合函数(源表需要聚合显示的列的字段名)
for 源表数据中需要转换为列名的列的字段名 in (转换后的列名1,转换后的列名2…))
as 表别名

2、举个例子

先创建一个作为数据源的表插入少量数据:

create table StudentScores 
(
StudentName varchar(16),
Subject varchar(16),
Score  smallint
)

insert into StudentScores
values('张三','语文',85)
insert into StudentScores
values('张三','数学',90)
insert into StudentScores
values('张三','英语',86)
insert into StudentScores
values('李四','语文',92)
insert into StudentScores
values('李四','数学',87)
insert into StudentScores
values('李四','英语',90)

此时 select * from StudentScores 直接查询结果如下:
sqlserver 行转列,SQL Server,数据库,sqlserver

下面是我们使用PIVOT函数转换后查询出的结果,先看下代码:

select * from StudentScores as s  --源数据
pivot(max(Score) for Subject in (语文,数学,英语)) as ss --转换后的结果数据

查询出的结果如图:
sqlserver 行转列,SQL Server,数据库,sqlserver
以上查询也可以使用动态查询语句来实现,具体方法请查看SQL Server纵表转横表

二、列转行UNPIVOT

1、语法

select * from 源表名 as 表别名
unpivot(定义由源表数据转换成的列的列名 for 定义由源表字段名转换成的列的列名 in
(源表字段名1,源表字段名2…)) as 表别名

2、实例

为求直观直接用上面实例的结果数据创建一个新表:

create table StudentGrades
(
StudentName varchar(16),
语文 smallint,
数学 smallint,
英语 smallint,
)
insert into StudentGrades
values('张三',85,90,86)
insert into StudentGrades
values('李四',92,87,90)

select * from StudentGrades直接查询结果如下:
sqlserver 行转列,SQL Server,数据库,sqlserver
使用UNPIVOT函数进行转换,代码如下:

select * from StudentGrades as sg --源数据
unpivot(Score for Subject in (语文,数学,英语)) as cjd --转换后的结果数据

结果如图:
sqlserver 行转列,SQL Server,数据库,sqlserver
和PIVOT函数的实例中源数据的表基本相同。当然我们也可以不创建新表直接使用以下代码查询出相同的结果:

select * from StudentScores as s 
pivot(max(Score) for Subject in (语文,数学,英语)) as ss
unpivot(Score for Subject in (语文,数学,英语)) as cjd

通过上面的例子,我们简单了解了PIVOT和UNPIVOT这两个函数的使用方法,在例子中我们用这两个函数实现了数据的行列逆转查询,虽然UNPIVOT函数可以将PIVOT函数转换后的结果还原成转换前的样子,但UNPIVOT 并不完全是 PIVOT 的逆操作。 PIVOT 执行聚合,并将多个可能的行合并为输出中的一行。 UNPIVOT 不重现原始表值表达式的结果,因为行已被合并。 另外,UNPIVOT 输入中的 NULL 值也在输出中消失了。 如果值消失,表明在执行 PIVOT 操作前,输入中可能就已存在原始 NULL 值。文章来源地址https://www.toymoban.com/news/detail-730702.html

到了这里,关于SQL Server行列转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL Server行列转换

    在使用SQL Server数据库的过程中我们经常会遇到需要将行数据和列数据相互转换显示的问题。对于这个问题SQL Server数据库有专门的内置函数PIVOT(行转列)、UNPIVOT(列转行)可以解决。下面我们就来分析一下这两个函数的使用方法。 1、语法 select * from 源表名 as 表别名 pivot( 聚合函

    2024年02月07日
    浏览(30)
  • Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

    前言:在对表数据进行批量处理过程中,常常碰上某个字段是一个array或者map形式的字段,一列数据的该字段信息同时存在多个值,当我们需要取出该数组中的每一个值实现一一对应关系的时候,可以考虑使用lateral view explode()/posexplode() 进行处理。 一、提要:explode()本身是

    2024年02月04日
    浏览(48)
  • Hive的行列转换(行转多列、多列转行、行转单列、单列转行)

    在实际使用Hive的过程中,常常会涉及到行列转换,细分的话,有下面4种类型的行列转换,分别是: 行转多列 多列转行 行转单列 单列转行 下面我们通过样例介绍每种行列转换的实现方法。 样例表 班级成绩表: 姓名(name) 学科(subject) 成绩(score) 行列转换思路分析及实现 行转

    2024年02月15日
    浏览(80)
  • Hive数据仓库行转列

    查了很多资料发现网上很多文章都是转发和抄袭,有些问题。这里分享一个自己项目中使用的行转列例子,供大家参考。代码如下: 如果是在SparkSQL或Presto平台,或者阿里云的MaxCompute平台,还可使用如下方式:

    2024年02月21日
    浏览(58)
  • 【SQL开发实战技巧】系列(三十七):数仓报表场景☞从表内始终只有近两年的数据,要求用两列分别显示其中一年的数据聊行转列隐含信息的重要性

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月18日
    浏览(48)
  • [SQL Server]SQL Server数据库中如何将时间日期类型(DateTime)转换成字符串类型(varchar,nvarchar)

    SQL Server数据库中,如何将时间日期类型(DateTime)的数据转换成字符串类型(varchar,nvarchar),并对其进行 yyyy-mm-dd 形式的格式化输出 使用SQL Server的 CONVERT() 函数,如下: SELECT LEFT(CONVERT(VARCHAR, GETDATE(), 120), 10) 或者 SELECT CONVERT(VARCHAR(10), GETDATE(), 120) 在SQL Server 2012及以上版本中,新增

    2024年02月07日
    浏览(71)
  • 连接数据库报com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    JDBC加载驱动,连接SQLServer 2012 报 java.ext.dirs: C:Program FilesJavajdk1.8.0_331jrelibext;C:WindowsSunJavalibext com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client pre

    2023年04月21日
    浏览(101)
  • 行转列--将多行数据转成多行多列的Table结构

    21年做的一个功能,涉及到将行数据转化成列数据。边查边做,一点一点的尝试着做好。当时感觉有点吃力。完成之后本想记录,但一直拖延至今。最近再次接手与这个功能相关的业务,整理了之前写的代码,趁此机会记录下来。 界面中是一个三级结构:L1级【Test Sample】,

    2024年02月05日
    浏览(54)
  • chatgpt赋能python:Python行转列:如何高效地处理大数据集

    Python是一种广泛使用的编程语言,最初用于Web开发,如今已成为专业开发、科学计算和数据分析等领域的一种首选语言。Python非常方便,尤其是在处理大数据集时。本文将介绍如何使用Python将行数据转换成列数据,以及如何在这个过程中优化效率。 行转列指的是将一组数据从

    2024年02月06日
    浏览(54)
  • greenplum行转列

    项目中需要将150w的数据转为1500列的大宽表数据。 最开始尝试了网上提供的两种方法: 实际业务中10行*1500列数据查询并插入需要25秒左右(测试服务器性能比较差) case when的问题是每个case when的语句都会把分组后的数据判断一下,时间复杂度为O²(O为行转列后的列数),非

    2024年02月03日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包