如何使用 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;
[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;