【发布时间】:2020-10-12 12:27:12
【问题描述】:
使用SQL,如何转换这样的单行表...
Firstname Surname Address1 City Country
--------- ------- --------------- ------ -------
Bob Smith 101 High Street London UK
...到 name-value 对的表,如下所示:
Name Value
--------- -------
Firstname Bob
Surname Smith
Address1 101 High Street
City London
Country UK
此脚本将创建原始表:
create table #OriginalTable (Firstname varchar(10), Surname varchar(10),
Address1 varchar(50), City varchar(10), Country varchar(10))
insert into #OriginalTable
select
'Bob' Firstname,
'Smith' Surname,
'101 High Street' Address1,
'London' City,
'UK' Country
我正在寻求一种通用解决方案,它不依赖于列名始终是示例中的名称。
编辑: 我正在使用 SQL Server 2005。 我所追求的解决方案是将这些数据转换为名称-值对表的 SQL 脚本
回答: 使用我接受的答案作为答案,这就是我所使用的:
select
result.Name,
result.Value
from
(select
convert(sql_variant,FirstName) AS FirstName,
convert(sql_variant,Surname) AS Surname,
convert(sql_variant,Address1) AS Address1,
convert(sql_variant,City) AS City,
convert(sql_variant,Country) AS Country
from #OriginalTable) OriginalTable
UNPIVOT (Value For Name In (Firstname, Surname, Address1, City, Country)) as result
【问题讨论】:
-
您使用的是什么 DBMS?不同的 DBMS 以不同的方式存储列的名称。
-
所以每个键都有多行?例如如果原始表不仅有 Bob Smith 的行,还有 John Doe 的行,那么您的名称-值对表将为每个键有 2 行。
-
@Dominic。不,原始表将始终只有一行。如果数据库中有更多不同人的行,原始表仍然只有一行,b/c 它只是一个人的过滤器。
-
您可以使用 UNPIVOT 进行一些研究。我阅读了这个问题,然后发现了这个:tinyurl.com/y8a7yc9。会试一试的。
标签: sql