我有一张这样的表
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,并且是不同的数据类型任何想法将是一个很大的帮助。
答案 0 :(得分:1)
我想说的是另一种方式,而不是使用pivot
或unpivot
,您也可以使用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
内使用temptable
和table 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