如何将(未知)行数分组到一行,其中设置列确定分组?
例如,转移
Ref Name Link
==============================
1 John L1
1 John L2
1 John L8
2 Steve L1
2 Steve L234
向
Ref Name ... ... ...
==========================================
1 John L1 L2 L8
2 Steve L1 L234 NULL
感谢您的帮助
答案 0 :(得分:8)
您可以使用row_number()作为列名源来旋转表:
select *
from
(
select ref,
name,
link,
row_number() over (partition by ref, name order by link) rn
from table1
) s
pivot (min (link) for rn in ([1], [2], [3], [4])) pvt
如果您有更多行,只需扩展数字列表。
答案 1 :(得分:5)
如果未知链接的数量未知,则需要动态完成。我认为这将按要求运作:
DECLARE @SQL NVARCHAR(MAX) = ''
SELECT @SQL = @SQL + ',' + QUOTENAME(Rownumber)
FROM ( SELECT DISTINCT ROW_NUMBER() OVER(PARTITION BY Ref, Name ORDER BY Link) [RowNumber]
FROM yourTable
) d
SET @SQL = 'SELECT *
FROM ( SELECT Ref,
name,
Link,
ROW_NUMBER() OVER(PARTITION BY Ref, Name ORDER BY Link) [RowNumber]
FROM yourTable
) data
PIVOT
( MAX(Link)
FOR RowNumber IN (' + STUFF(@SQL, 1, 1, '') + ')
) pvt'
EXECUTE SP_EXECUTESQL @SQL
这是通常的PIVOT函数的轻微变化,因为通常link
将在列标题中。它基本上确定了所需的列数(即每个参考/名称的链接的最大不同值),然后将值转移到这些列中。