SQL Server行列转换学习日记

article/2025/9/27 20:35:32

参考自https://www.cnblogs.com/wanghonghu/p/5631662.html

目录

  • 一,行转列
    • 1,case ...when.. 写法
    • 2,PIVOT函数快速实现行转列
    • 3,动态实现行转列
  • 二 ,列转换行
    • 1,静态sql列转行,当列头较少时使用
    • 2,使用UNPIVOT函数, 该语句必须sqlserver2005及以上版本才能使用

一,行转列

创建行转列表和插入数据

CREATE TABLE RowConvertToColumn(USERNAME VARCHAR(40)  NULL,COURSE VARCHAR(40)  NULL,SCORE NUMERIC(10,2)  NULL
) INSERT INTO RowConvertToColumn VALUES('张三','语文',84);
INSERT INTO RowConvertToColumn VALUES('张三','数学',94);
INSERT INTO RowConvertToColumn VALUES('张三','外语',76);
INSERT INTO RowConvertToColumn VALUES('李四','语文',88);
INSERT INTO RowConvertToColumn VALUES('李四','数学',95);
INSERT INTO RowConvertToColumn VALUES('李四','外语',80);
INSERT INTO RowConvertToColumn VALUES('王五','语文',98);
INSERT INTO RowConvertToColumn VALUES('王五','数学',96);
INSERT INTO RowConvertToColumn VALUES('王五','外语',70);
INSERT INTO RowConvertToColumn(USERNAME) VALUES('赵六');

查询一遍数据

在这里插入图片描述

1,case …when… 写法

SELECT USERNAME 姓名 ,		MAX(CASE COURSE WHEN '语文' THEN SCORE ELSE 0 END ) AS 语文,MAX (CASE COURSE WHEN '数学' THEN SCORE ELSE 0 END ) AS 数学,MAX(CASE COURSE WHEN '外语' THEN  SCORE ELSE 0 END  ) AS 外语
FROM RowConvertToColumn GROUP BY USERNAME ORDER BY USERNAME ;
效果:

在这里插入图片描述

2,PIVOT函数快速实现行转列

PIVOT函数的格式如下

 PIVOT(<聚合函数>([聚合列值]) FOR [行转列前的列名] IN([行转列后的列名1],[行转列后的列名2],[行转列后的列名3],.......[行转列后的列名N]))

实际操作:

SELECT USERNAME 姓名 , 语文, 数学,外语 FROM RowConvertToColumn PIVOT(MAX(SCORE) FOR COURSE IN (语文,数学,外语 ))AS T

效果:
在这里插入图片描述

3,动态实现行转列

declare @sql nvarchar(2000)
select @sql=ISNULL(@sql+',','')+course
from RowConvertToColumn
group by course
set @sql='select * from RowConvertToColumn pivot (max(score) for course in ('+@sql+')) a'
exec(@sql)

效果:
在这里插入图片描述

二 ,列转换行

创建列转行表和插入数据

CREATE TABLE ColumnConvertToRow([姓名] VARCHAR(40) NULL,[语文] NUMERIC(10,2)  NULL,[数学] NUMERIC(10,2)  NULL,[外语] NUMERIC(10,2)  NULL
) INSERT INTO ColumnConvertToRow VALUES('张三',85,78,64);
INSERT INTO ColumnConvertToRow VALUES('李四',89,54,78);
INSERT INTO ColumnConvertToRow VALUES('王五',64,78,97);

原始数据
在这里插入图片描述

1,静态sql列转行,当列头较少时使用

SELECT * FROM 
(SELECT 姓名,课程='语文',分数=语文 FROM ColumnConvertToRowUNION ALLSELECT 姓名,课程='数学',分数=数学 FROM ColumnConvertToRowUNION ALL SELECT 姓名,课程='外语',分数=外语 FROM ColumnConvertToRow
) T ORDER BY 姓名

效果:
在这里插入图片描述

2,使用UNPIVOT函数, 该语句必须sqlserver2005及以上版本才能使用

UNPIVOT函数的格式如下:

UNPIVOT([转换为行的列值在转换后对应的列名] for [转换为行的列名在转换后对应的列名] in ([转换为行的列1],[转换为行的列2],[转换为行的列3],...[转换为行的列N]))

实际操作:

SELECT 姓名,科目, 分数 FROM ColumnConvertToRow UNPIVOT(分数 FOR 科目 IN(语文,数学,外语)) AS T ORDER BY 姓名;

效果:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/t0mFmY8T.shtml

相关文章

Sql实现行列转换

从MS Sql Server 2005微软就推出了pivot和unpivot实现行列转换&#xff0c;这极大的方便了我们存储数据和呈现数据。今天就对这两个关键字进行分析&#xff0c;结合实例讲解如何存储数据&#xff0c;如何呈现数据。 例如学生选课和成绩系统中就有一张表&#xff0c;该表存储了…

sqlserver行列转换

一、使用sum(case when) 废话不多说,直接上图 select projectDeclare_id, sum(case when seq0 then score1 else NULL end) as diyihang, sum(case when seq1 then score1 else NULL end) as diyihang, sum(case when seq2 then score1 e…

SQL:实现行列转换

前言 推荐篇文章:Hive行列转换 这里我们要讨论的是如何实现把多个字段及其对应的字段&#xff0c;同时转换成两个字段。即如下表所示&#xff1a; 要做的是把它转换成下列形式&#xff1a; 实现 这里先直接上代码&#xff1a; #代码一&#xff1a; SELECT SPLIT(code_n…

Oracle中的行列转换

目录 一、行转列&#xff08;一&#xff09; 二、行转列&#xff08;二&#xff09; 三、列转行&#xff08;一&#xff09; 四、列转行&#xff08;二&#xff09; 行列转换是指将行数据转换为列数据&#xff0c;或将列数据转换为行数据的过程。这通常使用的办法是用PIVO…

SQL Server行列转换

1、行列转换 创建创建学生成绩表并添加学生成绩信息。 /*-创建学生成绩表-*/ CREATE TABLE StuScore (StuName VARCHAR(20), --姓名Subject VARCHAR(20), --科目Score INT --成绩 );/*-添加学生成绩信息-*/ INSERT INTO StuScore VALUES(张三,语文,60); I…

SQL 行列转换

方法1 select name, sum(case when course物理 then score else 0 end) as 物理, sum(case when course英语 then score else 0 end) as 英语 from T1方法2 动态SQL命令的执行效率往往不高&#xff0c;因为动态拼接的原因&#xff0c;导致数据库&#xff08;查询优化器&…

SQL:行列转换

参考自&#xff1a;https://www.cnblogs.com/janneystory/p/5622142.html 案例&#xff1a; 表scores 请转成的横表是这样子的&#xff1a; 答案; select 姓名, SUM(case 课程 when 语文 then 分数 else 0 end) as 语文, SUM(case 课程 when 数学 then 分数 else 0 end) a…

【SQL】MySQL 数据库的行列转换

报表系统中经常需要行列转换&#xff0c;在 SQL Server 等数据库中可以用 PIVOT 、UNPIVOT 来实现&#xff0c;但是在 MySQL 数据库中却不支持&#xff0c;下面介绍 MySQL 中的行列转换的实现方法。 1.行转列 例如下面是数据库中的原始表格&#xff1a; namesubjectscore张三…

SQL四种方法实现行列转换超详细

前言 大家好&#xff0c;我是楚生辉&#xff0c;在未来的日子里我们一起来学习大数据SQL相关的技术&#xff0c;一起努力奋斗&#xff0c;遇见更好的自己&#xff01; 本文详细的介绍了多个方法实现列转行&#xff0c;行转列&#xff0c;并提供了案例的材料&#xff0c;有需要的…

什么是xml解析?xml解析的有几种常用的解析方式?

xml解析概述 XML解析主要为两种&#xff1a;DOM和SAX解析 DOM:文档对象模型&#xff0c;这种方式是W3C推荐的处理XML的一种方式 SAX解析不是官方标准&#xff0c;属于开源社区XML-DEV,几乎所有的XML解析器都支持它 XML解析开发包&#xff1a; JAXP:是sun公司推出的解析标准实…

JAVA解析xml的五种方式比较

1)DOM解析 DOM是html和xml的应用程序接口(API)&#xff0c;以层次结构&#xff08;类似于树型&#xff09;来组织节点和信息片段&#xff0c;映射XML文档的结构&#xff0c;允许获取和操作文档的任意部分&#xff0c;是W3C的官方标准【优点】①允许应用程序对数据和结构做出更改…

XML解析的几种方式

xml的四种解析方式实例 一、DOM&#xff08;Document Object Model&#xff09;解析方式 在应用程序中,基于DOM的xml分析器将xml文档解析成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对xml数据的操作.通过DOM接口应用程序可以在任何时候访问…

C++解析XML文件

新的一周又来啦&#xff0c;这周我要分享的是使用C库解析XML文件和JSON文件&#xff0c;在本篇博客中我主要讲解析XML文件的相关知识&#xff0c;在下篇博客讲述有关解析JSON文件的相关。在解析XML文件时我使用的解析库是tinyXML2,编译平台是VS2019。希望看完本篇博客能对你有所…

解析XML的几种方式

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API fo…

C# 读取XML文件的几种方式

在开发过程中&#xff0c;我们有时会需要保存到本地一些结构化数据或者配置信息&#xff0c;这时就可以选择用xml文件。当然xml的用途也不仅仅是这些。 这一篇来谈一谈关于读取xml文件的几种方式&#xff1b; 我们有以下两个文件&#xff0c;一个是带有id属性的&#xff0c;一个…

Android解析XML的三种方式

在Android中提供了三种解析XML的方式:DOM(Document Objrect Model),SAX(Simple API XML),以及Android推荐的Pull解析方式. 如图: 本篇博客使用的xml文件如下:(这里是获取网络XML)person.xml <?xml version="1.0" encoding="UTF-8"?> <pers…

XML解析之SAX方式

XML文件解析方式之一是SAX方式&#xff0c;SAX解析方式会逐行地去扫描XML文档&#xff0c;当遇到标签时会触发解析处理器&#xff0c;采用事件处理的方式解析XML (Simple API for XML) 。SAX是一个用于处理XML事件驱动的“推”模型&#xff0c;虽然不是官方标准&#xff0c;但它…

实现XML解析的几种技术

XML在各种开发中都广泛应用&#xff0c;Android也不例外。作为承载数据的一个重要角色&#xff0c;如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。 在Android中&#xff0c;常见的XML解析器分别为SAX解…

MATLAB中的均值与方差求法(mean,var,std函数使用)

目录 均值-mean()函数的用法方差var函数std函数 均值-mean()函数的用法 对于矩阵A&#xff1a; &#xff08;1&#xff09;mean(A,1)为对矩阵A的列求均值 &#xff08;2&#xff09;mean(A,2)为对矩阵A的行求均值 &#xff08;3&#xff09;mean(A)当传入的参数只有矩阵时&a…

matlab怎么方差函数,密度函数已知,怎么用matlab求其数学期望和方差?

在没有先验知识的情况下是不可能的&#xff0c;在你已知它可能是哪种分布(或者哪些种分布之一)的情况下可以求出分布的参数www.mh456.com防采集。 因为你的是密度函2113数&#xff0c;所以不会5261是离散型随机变量&#xff0c;如果你有4102概率密度函数的表达式的话&#xff0…