T-SQL集团行转换成列(T-SQL Group Rows Into Columns)

2019-06-24 13:50发布

我怎么能团的(未知)的行数为单排,其中一组列确定分组?

例如,移

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

谢谢你的帮助

Answer 1:

你可能会使用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小提琴 。



Answer 2:

如果不同的链接的数量是未知的,这需要动态地进行。 我觉得这是需要将工作:

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

它是通常的旋转功能的轻微varation因为通常link将是在列标题。 它基本上确定然后在需要的列数(即,对于每REF /名称链接的最大不同的值)枢转值到这些列。



文章来源: T-SQL Group Rows Into Columns