如何在select中输出列作为行?

时间:2015-04-12 19:34:33

标签: sql sql-server sql-server-2008-r2

我有一张这样的表

Col1     Col2     Col3   Col4
1        2        3      3
2        23       4      7
3        3        12     4

我想要这样的输出

Col1    1   2   3
Col2    2   23  3
Col3    3   4   12
Col4    3   7   4

我已经google了,并在sql中找到了一些关于pivot的示例,将行转换为列,但它们基于表中某些值的聚合。我没有任何这样的值,我可以把聚合。实际的列数大约是30,并且是不同的数据类型任何想法将是一个很大的帮助。

1 个答案:

答案 0 :(得分:1)

我想说的是另一种方式,而不是使用pivotunpivot,您也可以使用dynamic sql与表格的行数或列数无关有,让我们一起检查:

架构:

create table tblSO(Col1  int,   Col2  int,   Col3 int,   Col4 int)
insert into tblSO values
(1,        2,        3,      3),
(2,        23,       4,      7),
(3,        3 ,       12,     4);

现在在row_number内使用temptabletable variable(或dynamic sql)即可达到您想要的结果:

declare @counter int = 1
declare @counter2 int
set @counter2=(select count(*) from tblSO)

declare @Sql varchar(max)='create table #rotate (colname varchar(20) '
while @counter<=@counter2
begin
    set @Sql=@Sql+', val_'+cast(@counter as varchar)+' int'
    set @counter=@counter+1
end 
set @counter =1
set @Sql=@Sql+');
insert into #rotate(colname) 
values (''Col1''),(''Col2''),(''Col3''),(''Col4'');
'

set @Sql = @Sql + '
create table #cte(col1  int,col2  int,col3 int,col4 int,rn int)
insert into #cte
select col1,col2,col3,col4,
       row_number() over(order by Col1) rn
from tblSO;
'

while @counter<=@counter2
begin
declare @cl varchar(50)=cast(@counter as varchar)
set @Sql=@Sql + '
 update #rotate set val_'+@cl+'= 
    (select col1 from #cte where rn='+@cl+') where colname=''Col1''
 update #rotate set val_'+@cl+'= 
    (select col2 from #cte where rn='+@cl+') where colname=''Col2''
 update #rotate set val_'+@cl+'= 
    (select col3 from #cte where rn='+@cl+') where colname=''Col3''
 update #rotate set val_'+@cl+'= 
    (select col4 from #cte where rn='+@cl+') where colname=''Col4'' '
set @counter=@counter+1
end
set @Sql=@Sql + ' select * from #rotate
                  drop table #rotate
                  drop table #cte'
exec(@Sql)

输出:

Col1    1   2   3
Col2    2   23  3
Col3    3   4   12
Col4    3   7   4