JBa*_*nes 7 sql t-sql grouping sql-server-2008
如何将(未知)行数分组到一行中,设置列确定分组?
例如,转移
Ref Name Link
==============================
1 John L1
1 John L2
1 John L8
2 Steve L1
2 Steve L234
Run Code Online (Sandbox Code Playgroud)
成
Ref Name ... ... ...
==========================================
1 John L1 L2 L8
2 Steve L1 L234 NULL
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
您可以使用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
Run Code Online (Sandbox Code Playgroud)
如果您有更多行,只需扩展数字列表即可.
如果未知链接的数量未知,则需要动态完成.我认为这将按要求工作:
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
Run Code Online (Sandbox Code Playgroud)
这是通常的PIVOT函数的轻微变化,因为通常link
会在列标题中.它基本上确定了所需的列数(即每个ref/Name的链接的最大不同值),然后将值移动到这些列中.
归档时间: |
|
查看次数: |
12085 次 |
最近记录: |