如何使用 SQL 将 column/row 对转换为 key/value?

How to convert column/row pair to key/value by using SQL?

[PlayerCode] | [Name]   | [Age] | [Club]
142          | Messi    | 34    | PSG
333          | Ronaldo  | 36    | Manchester United
532          | Pique    | 34    | FC Barcelona

[PlayerCode] | [Key]    | [Value]
142          | Name     | Messi
142          | Age      | 34 
142          | Club     | PSG
333          | Name     | Ronaldo
333          | Age      | 36
333          | Club     | Manchester United
532          | Name     | Pique
532          | Age      | 34
532          | Club     | FC Barcelona

我想使用 SQL 服务器将第一个 table 转换为第二个 key/value table。 我假设 'unpivot' 函数将用于进行转换,但我不知道如何..

有人知道怎么做吗?

您可以使用联合:

SELECT PlayerCode, [Key], [Value]
FROM
(
    SELECT PlayerCode, 'Name' AS [Key], Name AS [Value], 1 AS pos FROM yourTable
    UNION ALL
    SELECT PlayerCode, 'Age', CAST(Age AS varchar(3)), 2 FROM yourTable
    UNION ALL
    SELECT PlayerCode, 'Club', Club, 3 FROM yourTable
) t
ORDER BY PlayerCode, pos;

两个快速选项。

性能更高(并提供更多灵活性)

 Select A.[PlayerCode]
       ,B.*
  From  YourTable A
  Cross Apply ( values ('Name',[Name])
                      ,('Age' ,concat('',[Age]))
                      ,('Club',[Club])
              ) B([Key],[Value])    

更动态(任意数量的列)

 Select A.[PlayerCode]
       ,B.[Key]
       ,B.[Value]
  From  YourTable A
  Cross Apply OpenJSON( (Select A.* For JSON Path,Without_Array_Wrapper ) ) B
  Where [key] not in ('PlayerCode')

注意我们只需要排除[PlayerCode]即可,不需要数据类型的转换。 NULL 值也将被排除。

我看到有更多的答案,但我在这里留下了我的答案,因为它是唯一使用 UNPIVOT 的答案。也许它对您或其他人有用:

create table players (
  [PlayerCode] int,
  [Name]   varchar(50),
  [Age] int,
  [Club] varchar(50)
)

insert into players values 
(142, 'Messi', 34, 'PSG'),
(333, 'Ronaldo', 36, 'Manchester United'),
(532, 'Pique', 34, 'FC Barcelona')

SELECT PlayerCode, [Key], Value  
FROM   
   (SELECT PlayerCode, Name, cast(Age as varchar(50)) Age, Club
   FROM players) p  
UNPIVOT  
   (Value FOR [Key] IN   
      (Name, Age, Club)  
)AS unpvt;