T-SQL 将行分组为列

9

如何将(未知数量的)行分组为一个单独的行,其中设置的列确定分组?

例如,班次

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

感谢您的任何帮助。

可能是重复的问题:如何将行转换为列 - Pondlife
您可能正在寻找 PIVOT 或 UNPIVOT。 - Chris Gessler
2个回答

12

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

如果你有更多的行,只需扩展数字列表。

SQL Fiddle上进行了在线测试


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会在列标题中。它基本上确定所需的列数(即每个ref/Name的Link最大不同值),然后将这些值旋转到这些列中。


1
我有一个“最大”链接数量,因此上面的答案在这种情况下适用。但是,这对于将来参考非常有用 - 谢谢。 - JBarnes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接