您好我正在SQL Server中尝试以下表的透视
REFID | COL1 | COL2 | Sequence
1 abc cde 1
1 lmn rst 2
1 kna asg 3
2 als zkd 2
2 zpk lad 1
我希望输出为
COLNAME REFID | 1 | 2 | 3
COL1 1 abc lmn kna
COL2 1 cde rst asg
COL1 2 zpk als null
COL2 2 lad zkd null
原始表中的列数是已知的,但行数未知。任何人都可以提供帮助
答案 0 :(得分:2)
为了获得最终结果,您可以使用PIVOT功能,但首先我会取消col1
和col2
列的移动,这样您就不会有多列要转动。
如果您的列数有限,则可以对查询进行硬编码:
select REFID, col, [1], [2], [3]
from
(
select REFID, Sequence, col, value
from yourtable
cross apply
(
select 'COL1', col1 union all
select 'COL2', col2
) c (col, value)
) d
pivot
(
max(value)
for sequence in ([1], [2], [3])
) piv
order by refid;
但是你有一个未知数量的sequence
值,那么你可以使用动态SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(sequence)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT refid, col,' + @cols + '
from
(
select REFID, Sequence, col, value
from yourtable
cross apply
(
select ''COL1'', col1 union all
select ''COL2'', col2
) c (col, value)
) x
pivot
(
max(value)
for Sequence in (' + @cols + ')
) p
order by refid'
execute sp_executesql @query;