将行转换为SQL Server中的列行

时间:2015-06-25 06:14:14

标签: sql sql-server pivot

我正在寻找一种方法,将表中的行转换为列行,并为每个行指定列名。

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

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

1 个答案:

答案 0 :(得分:3)

这是使用动态交叉表的一种方法。有关详细信息,请阅读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