嗨,我正在尝试在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
我希望输出为
REFID | 1COL1 | 2COL1 | 3COL1 |1COL2|2COL2|3COL2 1 abc lmn kna cde rst asg 2 zpk als null lad zkd null
原始表中的列数是已知的,但行数是未知的。谁能帮忙
如果要将sequence数字包括在列名中,则仍然需要先取消透视col1和col2列,然后再应用透视。所不同的是,您会将sequence数字连接到在取消透视过程中创建的列名。
sequence
col1
col2
对于已知数量的值,查询将为:
select REFID, [1col1], [2col1], [3col1], [1col2], [2col2], [3col2] from ( select REFID, col = cast(Sequence as varchar(10))+ col, value from yourtable cross apply ( select 'COL1', col1 union all select 'COL2', col2 ) c (col, value) ) d pivot ( max(value) for col in ([1col1], [2col1], [3col1], [1col2], [2col2], [3col2]) ) piv order by refid;
然后,如果您有未知的数字,则动态SQL版本将为:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT ',' + QUOTENAME(cast(Sequence as varchar(10))+ col) from yourtable cross apply ( select 'Col1', 1 union all select 'Col2', 2 ) c(col, so) group by Sequence, col, so order by so, sequence FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT refid, ' + @cols + ' from ( select REFID, col = cast(Sequence as varchar(10))+ col, value from yourtable cross apply ( select ''COL1'', col1 union all select ''COL2'', col2 ) c (col, value) ) x pivot ( max(value) for col in (' + @cols + ') ) p order by refid' execute sp_executesql @query;