这种类型的数据转换可以通过同时应用SQL Server 中的UNPIVOT
和 then函数来完成。PIVOT
该UNPIVOT
函数获取您的 columns Alias
、ShortName
和LongName
并将IssuerID
它们转换为行值。但是,为了使UNPIVOT
这些值的数据类型起作用,这些值必须相同:
select typename, value, fields
from
(
select cast(alias as varchar(20)) alias,
shortname,
longname,
cast(issuerid as varchar(20)) issuerid,
typename
from Table1
) u
unpivot
(
value
for fields in (Alias, ShortName, LongName, IssuerId)
) unpiv
请参阅带有演示的 SQL Fiddle
编辑数据UNPIVOT
后,您可以将该PIVOT
函数应用于Typename
列值:
select fields, [current], [provisional], [legacy]
from
(
select typename, value, fields
from
(
select cast(alias as varchar(20)) alias,
shortname,
longname,
cast(issuerid as varchar(20)) issuerid,
typename
from Table1
) u
unpivot
(
value
for fields in (Alias, ShortName, LongName, IssuerId)
) unpiv
) src
pivot
(
max(value)
for typename in([current], [provisional], [legacy])
) piv
请参阅带有演示的 SQL Fiddle
查询的结果是:
| FIELDS | CURRENT | PROVISIONAL | LEGACY |
----------------------------------------------------------
| alias | 1 | 2 | 3 |
| issuerid | 23 | 34 | 50 |
| longname | ABC Pvt Ltd. | DEF Pvt Ltd. | GHI Pvt Ltd. |
| shortname | ABC | DEF | GHI |
如果您无权访问UNPIVOT
andPIVOT
函数,那么您可以使用UNION ALL
查询来复制 the UNPIVOT
,然后使用带有 a 的聚合函数CASE
来复制 a PIVOT
:
select fields,
max(case when typename = 'current' then value end) [current],
max(case when typename = 'provisional' then value end) provisional,
max(case when typename = 'legacy' then value end) legacy
from
(
select typename, cast(alias as varchar(20)) value, 'alias' fields
from Table1
union all
select typename, shortname value, 'shortname' fields
from Table1
union all
select typename, longname value, 'longname' fields
from Table1
union all
select typename, cast(issuerid as varchar(20)) value, 'issuerid' fields
from Table1
) src
group by fields
请参阅带有演示的 SQL Fiddle
结果将与两个版本相同。