这种类型的数据转换称为数据透视。SQL Server 具有从 SQL Server 2005 开始的数据透视函数。
在 SQL Server 2005 之前,这可以使用带有CASE
表达式的聚合函数来完成:
select [user],
max(case when ENDPOINTTYPE = 'HomePhone' then EndPoint end) HomePhone,
max(case when ENDPOINTTYPE = 'CellPhone' then EndPoint end) CellPhone,
max(case when ENDPOINTTYPE = 'Email' then EndPoint end) Email
from yourtable
group by [user];
请参阅SQL Fiddle with Demo。
如果您使用的是 SQL Server 2005+,则数据透视查询将如下所示:
select *
from
(
select [user], endpoint, endpointtype
from yourtable
) src
pivot
(
max(endpoint)
for endpointtype in (HomePhone, CellPhone, Email)
) piv
请参阅带有演示的 SQL Fiddle
如果您提前知道这些值,则上述查询非常有用。如果你不这样做,那么你会想要使用动态 sql:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(ENDPOINTTYPE)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT [USER],' + @cols + ' from
(
select [USER], [ENDPOINT], [ENDPOINTTYPE]
from yourtable
) x
pivot
(
max(ENDPOINT)
for ENDPOINTTYPE in (' + @cols + ')
) p '
execute(@query)
请参阅带有演示的 SQL Fiddle
所有查询都返回相同的结果:
| USER | HOMEPHONE | CELLPHONE | EMAIL |
----------------------------------------------
| 123 | 123456 | 456789 | A@gmail.com |