【问题标题】:T-SQL Group Rows Into ColumnsT-SQL 将行分组为列
【发布时间】:2012-05-18 12:46:15
【问题描述】:

如何将(未知)数量的行组合成一行,其中设置的列确定分组?

比如换档

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

感谢您的帮助

【问题讨论】:

标签: sql sql-server-2008 tsql grouping


【解决方案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

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

Live test is @ Sql Fiddle.

【讨论】:

    【解决方案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
    

    它与通常的 PIVOT 函数略有不同,因为通常link 将位于列标题中。它基本上确定了所需的列数(即每个引用/名称的链接的最大不同值),然后将值转置到这些列中。

    【讨论】:

    • 我有 maximum 个链接,因此上述答案在这种情况下有效。但是,这对将来的参考很有用 - 谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多