在做一些数据分析与数据展示时,经常会遇到行转列,列转行的需求,今天就来总结下:

在开始之前,先来创建一个临时表,并且写入一些测试数据:

/*
第一步:创建临时表结构
*/
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 中将数据行转列列转行(一)的更多相关文章

  1. Sql server 中将数据行转列列转行(二)

    老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName ), --学生名称 ...

  2. 在SQL Server中将数据导出为XML和Json

        有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...

  3. SQL Server 插入数据时自增长列如何指定数值

    SQL Server 表在导入数据时,有时需要将自增长列指定数值,来保证导入前后的数据完全一致,如何实现? SQL Server 提供了方法: SET IDENTITY_INSERT,允许将显式值插入 ...

  4. SQL SERVER 实现多行转多列

    有这样一个需求,一个表单主表,一个扩展列表,查询的时候要把扩展列表中的多行转成主表多列. 比如 dt_zhubiao [主表] id type title 1 1 表单1-1 2 1 表单1-2 3 ...

  5. 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 ...

  6. SQL Server中将多行数据拼接为一行数据并且有特殊字符

    有表结构如下: 这时,要求显示所有学生的爱好的结果集,代码如下: ) as hobby FROM ( SELECT name, (SELECT hobby+',' FROM student WHERE ...

  7. 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)

    传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...

  8. 通过DBCC Page查看在SQL Server中哪行数据被锁住了?

    原文:通过DBCC Page查看在SQL Server中哪行数据被锁住了? 如何查看被锁的是哪行数据?通过dbcc page可以. 要想明白这个问题: 首先,需要模拟阻塞问题,这里直接模拟了阻塞问题的 ...

  9. SQL Server获取指定行的数据

    SQL Server获取指定行(如第二行)的数据   --SQL Server获取指定行(如第二行)的数据-- --法一(对象法)-- select * from ( select * , numbe ...

随机推荐

  1. 图像处理中Stride和Width的关系

    一行有 11 个像素(Width = 11), 对一个 32 位(每个像素 4 字节)的图像, Stride = 11 * 4 = 44. 但还有个字节对齐的问题, 譬如: 一行有 11 个像素(Wi ...

  2. 201671030111 李蓉 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 掌握软件项目评审会流程,反思总结课程学习内容. 任务一:结合本学期课程学习 ...

  3. iwlist/iwconfig/iw命令

    1.iwlist 命令:用于对/proc/net/wireless文件进行分析,得出无线网卡相关信息 # iwlist wlan0 scanning 搜索当前无线网络 # iwlist wlan0 f ...

  4. mysql考题

    mysql 的考题 数据库考试题目 名字: 一.简答 1. mysql的管理员是?mysql的端口是? root,3306 2. mysql中常见的数据类型有哪些, int  char  varcha ...

  5. mysql,本地连接看到的数据库不全,远程连接看到的数据库是完整的

    xshell本地连接数据库,show databases; 下面只显示了两个数据库,mysql数据库看不到,问题原因是:用户没有权限 navicat远程连接,比上面看到的数据库多了很多,能看到mysq ...

  6. wordpress角色权限汇总

    我们在用wordpress开发的时候有时候需要设置不同的用户组及权限,具体有哪些角色权限呢?随ytkah一起来看看吧.WordPress使用了角色的概念,旨在让站点所有者能够控制用户在站点中可以做什么 ...

  7. Pychram中使用reduce()函数报错:Unresolved reference 'reduce'

    python3不能直接使用reduce()函数,因为reduce() 函数已经被从全局名字空间里移除了,它现在被放置在fucntools 模块里,所以要使用reduce函数得先饮用fucntools ...

  8. 用mysql实现类似于oracle dblink的功能

      用mysql实现类似于oracle dblink的功能 首先看看有没有federated 引擎. mysql> show engines; +------------+----------+ ...

  9. react hooks沉思录

    将UI组件抽象为状态处理机.分为普通状态和副作用状态. 一.综述 useState:处理函数只改变引用的状态本身:副作用状态:会对引用状态以外的状态和变量进行修改:useReducer:用解藕化的机制 ...

  10. vue.js不仅是一种模式,也是一种工程组织方式

    vue.js不仅是一种模式,也是一种工程组织方式