pun*_*eet 2 sql sql-server pivot
嗨,我在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
Run Code Online (Sandbox Code Playgroud)
我希望输出为
REFID | 1COL1 | 2COL1 | 3COL1 |1COL2|2COL2|3COL2
1 abc lmn kna cde rst asg
2 zpk als null lad zkd null
Run Code Online (Sandbox Code Playgroud)
原始表中的列数是已知的,但行数未知.任何人都可以帮忙
如果要将sequence数字作为列名称的一部分包含在内,则仍需要首先取消对列col1和col2列的拆分,然后应用数据透视表.不同之处在于,您将连接sequence数字与在unpivot过程中创建的列名称连接.
对于已知数量的值,查询将是:
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;
Run Code Online (Sandbox Code Playgroud)
然后,如果您有一个未知的数字,动态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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
436 次 |
| 最近记录: |