Sql server 中将数据行转列列转行(一)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Sql server 中将数据行转列列转行(一),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3350字,纯文字阅读大概需要5分钟。
内容图文
第一步:创建临时表结构 */ 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); View Code数据准备好了之后,开始今天的正题:
一:行转列,下面是转换之前与之后的截图对比
方法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 中将数据行转列列转行(一)
标签:server 准备 运行 执行 var one serve group 不能
本文系统来源:https://www.cnblogs.com/Rawls/p/11027413.html
内容总结
以上是互联网集市为您收集整理的Sql server 中将数据行转列列转行(一)全部内容,希望文章能够帮你解决Sql server 中将数据行转列列转行(一)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。