在 SQL 服务器中将行转换为列行

Convert Rows to column rows in SQL Server

我正在寻找一种方法将 table 中的行转换为列行并为每行分配列名。

Players Id  Team
john    1   t1
carmel  1   t1
jack    1   t1
james   1   t1

更改为:

Id  Team  p1    p2      p3      p4
1   t1    john  carmel  jack    james

上例中可以有任意数量的玩家。 我尝试使用枢轴。我可以将行更改为列,但不是我正在寻找的方式。

这是使用动态交叉表的一种方法。阅读 Jeff Moden 的这篇 article 了解更多详情。

DECLARE @sql1 VARCHAR(4000) = ''
DECLARE @sql2 VARCHAR(4000) = ''
DECLARE @sql3 VARCHAR(4000) = ''

SELECT @sql1 =
'SELECT 
    Id
    , Team
'

SELECT @sql2 = @sql2 +
'   , MAX(CASE WHEN RN = ' + CONVERT(VARCHAR(10), RN) + ' THEN Players END) AS ['  + CONVERT(VARCHAR(10), RN) + ']' + CHAR(10)
FROM(
    SELECT DISTINCT
        RN = ROW_NUMBER() OVER(PARTITION BY Id, Team ORDER BY (SELECT NULL))
    FROM Tbl
)t
ORDER BY RN

SELECT @sql3 =
'FROM(
    SELECT *,
        RN = ROW_NUMBER() OVER(PARTITION BY Id, Team ORDER BY (SELECT NULL))
    FROM Tbl
)t
GROUP BY
Id, Team'

PRINT (@sql1 + @sql2 + @sql3)
EXEC (@sql1 + @sql2 + @sql3)

SQL Fiddle