Sql server 中将数据行转列列转行(一)
在做一些数据分析与数据展示时,经常会遇到行转列,列转行的需求,今天就来总结下:
在开始之前,先来创建一个临时表,并且写入一些测试数据:
/*
第一步:创建临时表结构
*/
CREATE TABLE #Student --创建临时表
(
StuName nvarchar(20), --学生名称
StuSubject nvarchar(20),--考试科目
StuScore int --考试成绩
)
DROP TABLE #Student --删除临时表
SELECT * FROM #Student --查询所有数据 /*
第二步:写入测试数据
*/
--张三
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('张三','语文',80);
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('张三','数学',75);
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('张三','英语',65);
--李四
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('李四','语文',36);
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('李四','数学',56);
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('李四','英语',38);
--王五
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('王五','语文',69);
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('王五','数学',80);
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('王五','英语',78);
--赵六
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('赵六','语文',80);
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('赵六','数学',80);
INSERT INTO #Student(StuName,StuSubject,StuScore) values ('赵六','英语',95);
数据准备好了之后,开始今天的正题:
一:行转列,下面是转换之前与之后的截图对比

方法1:使用Case when 方式
SELECT StuSubject
,SUM(CASE WHEN StuName='张三' THEN StuScore END) as '张三'
,SUM(CASE WHEN StuName='王五' THEN StuScore END) as '王五'
,SUM(CASE WHEN StuName='赵六' THEN StuScore END) as '赵六'
FROM #Student
GROUP BY StuSubject
适用场景:要转换成多少列确定,比如上面,已经确切知道只有张三、李四、王五、赵六 四个人;
缺点:1.如果有20个人,要写20个CASE 判断,写起来恶心,代码不优雅;
2.无法解决列是动态产生的问题,比如按月份日期转换2月有可能28天,其它月份30天;
方法2:使用PIVOT 关键字
SELECT *
FROM #Student
PIVOT(SUM(StuScore) FOR [StuName] IN("李四","王五","张三","赵六")) AS T
适用场景:要转换成多少列确定,比如上面,已经确切知道只有张三、李四、王五、赵六 四个人;
缺点:1.无法解决列是动态产生的问题,比如按月份日期转换2月有可能28天,其它月份30天;
方法3:使用PIVOT、EXEC关键

Declare @StuName varchar(100);
Declare @sql nvarchar(4000)
--步骤1.假设列不固定,是动态产生的,需要先将所有列组合成一个长字符串,比如A,B,C ,
下面的写法只能在SQL server2017中运行,更多将多行字段合并成一个字段方法参考:https://www.cnblogs.com/Rawls/p/10758788.html
SELECT @StuName='"'+STRING_AGG(StuName,'","')+'"'
FROM (
SELECT StuName from #Student GROUP BY StuName
) AS TE
--Print @StuName
--步骤2.由于动态产生的列,脚本不能执行,所以用Exec来执行,把脚本写成一个字符串。
SET @sql='
SELECT *
FROM #Student
PIVOT(SUM(StuScore) FOR [StuName] IN('+@StuName+')) AS T
'
--步骤3.执行脚本
Exec(@sql)

适用场景:可以解决列是动态产生的问题,不然这样的写法,太曲线救国了,很长一堆代码,
管你2月是28天还是100天,只要在步骤1中拼接起来就搞定了;
这一篇介绍了如何把数据行转换成数据列,下一篇介绍如果把数据列转换成数据行:https://www.cnblogs.com/Rawls/p/11027605.html
Sql server 中将数据行转列列转行(一)的更多相关文章
- Sql server 中将数据行转列列转行(二)
老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName ), --学生名称 ...
- 在SQL Server中将数据导出为XML和Json
有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...
- SQL Server 插入数据时自增长列如何指定数值
SQL Server 表在导入数据时,有时需要将自增长列指定数值,来保证导入前后的数据完全一致,如何实现? SQL Server 提供了方法: SET IDENTITY_INSERT,允许将显式值插入 ...
- SQL SERVER 实现多行转多列
有这样一个需求,一个表单主表,一个扩展列表,查询的时候要把扩展列表中的多行转成主表多列. 比如 dt_zhubiao [主表] id type title 1 1 表单1-1 2 1 表单1-2 3 ...
- SQL Server中将多行数据拼接为一行数据(一个字符串)
表A中id与表B中aid为一对多的关系 例如: 表A: id name a1 tom a2 lily a3 lucy 表B: id aid value b1 a1 B1 b2 a1 B2 b3 a2 ...
- SQL Server中将多行数据拼接为一行数据并且有特殊字符
有表结构如下: 这时,要求显示所有学生的爱好的结果集,代码如下: ) as hobby FROM ( SELECT name, (SELECT hobby+',' FROM student WHERE ...
- 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)
传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...
- 通过DBCC Page查看在SQL Server中哪行数据被锁住了?
原文:通过DBCC Page查看在SQL Server中哪行数据被锁住了? 如何查看被锁的是哪行数据?通过dbcc page可以. 要想明白这个问题: 首先,需要模拟阻塞问题,这里直接模拟了阻塞问题的 ...
- SQL Server获取指定行的数据
SQL Server获取指定行(如第二行)的数据 --SQL Server获取指定行(如第二行)的数据-- --法一(对象法)-- select * from ( select * , numbe ...
随机推荐
- javascript学习3、数据类型、数据类型转换、运算符
数据类型包括:基本数据类型和引用数据类型 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值 ...
- async/await 和 trycatch/throwable机制类似
async/await 和 trycatch/throwable机制类似
- PureComponent & shouldComponentUpdate
Called to determine whether the change in props and state should trigger a re-render. Component alwa ...
- SQL Server 定期归档大表历史数据
很少有开发会考虑到数据归档的问题已经数据增长的问题,当程序运行一段时间后,就会出现各种问题,部分问题可以修改SQL语句或使用索引来解决,但如果SQL语句无法修改,糟糕的SQL语句无法使用索引,归档历史 ...
- 数组排序代码,冒泡排序&快速排序&选择排序
冒泡排序: for(var i=0;i<arr.length-1;i++){ for(var j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1 ...
- MyBatis框架,增删改查
一.recourses中核心配置文件mybatis-config.xml 二. recourse中jdbc.properties 三.entity实体类 四.Dao层 五.ISmbmsUserDao. ...
- TypeScript 真香系列——接口篇
接口带来了什么好处 好处One —— 过去我们写 JavaScript JavaScript 中定义一个函数,用来获取一个用户的姓名和年龄的字符串: const getUserInfo = funct ...
- PSQLException: An I/O error occurred while sending to the backend.
postgresql批量新增数据时,批量插入的数据量太大了,造成了IO异常 只能把这么多数据先进行分割,再批量插入,但是感觉这种方式不是最优解,先暂时顶着,具体List分割方式如下: package ...
- Debian系Linux 发行版 源配置说明
概述: 本文是在逛论坛是的发现,借鉴过来,以便学习.源列表主文件 /etc/apt/sources.list同时也可创建独立的源配置文件到 /etc/apt/sources.list.d/* 下 so ...
- 转载:关于思科交换机、路由器如何关闭telnet 开启ssh服务
等保测评要求: 必须关闭telnet服务,开启ssh服务 即用ssh方式登录网络设备,而不允许用telnet. 输入密码.en 再次输入密码.sh run 这些常规动作就不再赘述. 1.关闭telne ...