SqlServer 行列转换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SqlServer 行列转换相关的知识,希望对你有一定的参考价值。
我数据库里有张Employee表: ID FirstName LastName 1 san zhang 2 si li 3 wu wang 我现在想把行和列转换一下 转换之后就是这样: ID 1 2 3 FirstName san si wu LastName zhang li wang 我现在的做法是: 在store prodcedure里面,建立一个tmp table,这个table用dynamic sql来生成columns。有一个employee,就要一个column。如果有1万个employee,就要有1万个columns。 然后再一个一个地往这个tmp table里面填数据 这种做法问题不少,最大的问题就是performance 我想知道有什么更简单的方法。也许根本不需要在store procedure里来做,也许.net sql report自己就能变。 又或者sql 2008里面有什么function能够做到pivot之类的 有谁知道能赐教下吗,万分感谢
参考技术A 目前除了povit没什么别的好方法,你也可以去reportserver
里面的矩阵看看,这个东西性能平时很少有人关注
sqlserver行列转换,动态行转换
例如下图:a组可能是3行,b组2行,c组5行
declare @t table
(
id int, groups varchar(max), Name varchar(max)
);
insert into @t
select 1,'a','分类a1' union all
select 2,'a','分类a2' union all
select 3,'a','分类a3' union all
select 4,'b','分类b1' union all
select 5,'b','分类b2' union all
select 6,'c','分类c1' union all
select 7,'c','分类c2' union all
select 8,'c','分类c3' union all
select 9,'c','分类c4' union all
select 10,'c','分类c5'
直接用PIVOT函数进行行列转换
SELECT * FROM(SELECT * from @t)t
PIVOT(MAX(Name) FOR groups IN(a,b,c))pvt
不是自己想要结果
使用ROW_NUMBER PARTITION 得到分组 序号
SELECT ROW_NUMBER() over(PARTITION by groups order by id) rn,groups,Name from @t
然后再使用 PIVOT转换即可
SELECT * FROM(SELECT ROW_NUMBER() over(PARTITION by groups order by id) rn,groups,Name from @t)t
PIVOT(MAX(Name) FOR groups IN(a,b,c))pvt
以上是关于SqlServer 行列转换的主要内容,如果未能解决你的问题,请参考以下文章