试试这样的。
这涉及Unpivoting、Pivoting 和Dynamic Query。
declare @sql nvarchar(max),@col_list varchar(500)=''
;WITH cte1 AS
(
SELECT *
FROM Yourtable )
,cte2 AS
(
SELECT col_name,
val
FROM cte1
CROSS apply (VALUES
('cola',cola)
,('colb',colb)
,('colc',colc)
,('cold',cold)
,('cole',cole) ) cs (col_name,val))
SELECT @col_list += col_name+','
FROM cte2
WHERE val IS NOT NULL
SET @col_list = LEFT(@col_list,Len(@col_list)-1)
SET @sql = ' ;with cte1 as
(select * from tst ),
cte2 as
(select col_name,val from cte1
cross apply (values(''cola'',cola),(''colb'',colb),
(''colc'',colc),(''cold'',cold),(''cole'',cole) ) cs
(col_name,val))
select* from cte2
pivot (max(val) for col_name in ('+@col_list+')) p'
EXEC Sp_execute
@sql