在 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)
我正在寻找一种方法将 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)