时间:2021-07-01 10:21:17 帮助过:17人阅读
一:列转行,下面是转换之前与之后的截图对比
如果想要行转列,参考上一篇:Sql server 中将数据行转列列转行(一)
方法一:使用 UNION ALL 拼接多个结果集
SELECT * FROM ( SELECT StuName,课程=‘语文‘,分数=Chinese FROM #Student UNION ALL SELECT StuName,课程=‘数学‘,分数=Math FROM #Student UNION ALL SELECT StuName,课程=‘英语‘,分数=English FROM #Student )AS TE ORDER BY TE.StuName ASC
方法二:使用UNPIVOT,推荐此方法;
SELECT * FROM #Student UNPIVOT (分数 FOR 课程 IN([Chinese],Math,English)) T
方法三:使用UNPIVOT,处理动态列情况,看过我上一篇内容的,应该知道,在进行行转列的时候,有时候不太确定到底有多少行的可能,
会有动态的情况,但是在处理列转行的情况时,一般每个数据库在进行数据存储的时候,列有多少个,都是已经确定的,不存在不确定性,
所以,第三种方法知道就可以了,实用性不大,不推荐此方法。
DECLARE @sql NVARCHAR(4000) SELECT @sql=isnull(@sql+‘,‘,‘‘)+quotename(Name) FROM syscolumns WHERE ID=object_id(‘Student‘) AND Name NOT IN(‘StuName‘) --不显示学生名称列 ORDER BY Colid --print @sql SET @sql=‘ SELECT * FROM #Student UNPIVOT (分数 FOR 课程 IN(‘+@sql+‘)) T ‘ Exec(@sql)
注意:上面的这一部分,由于查询了syscolumns 数据库内置系统表,我演示的数据是临时表,是查不到任何数据的,必须创建实际的数据库表才可以使用。
Sql server 中将数据行转列列转行(二)
标签:nvarchar col https 系统表 -- gif student 结果 htm