T-SQL组进入列

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)

谢谢你的帮助

Nik*_*vić 9

您可以使用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)

如果您有更多行,只需扩展数字列表即可.

现场测试是@Sql Fiddle.


Gar*_*thD 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
Run Code Online (Sandbox Code Playgroud)

这是通常的PIVOT函数的轻微变化,因为通常link会在列标题中.它基本上确定了所需的列数(即每个ref/Name的链接的最大不同值),然后将值移动到这些列中.