這種類型的數據轉換被稱爲樞軸。 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 with Demo
上述查詢工作的偉大,如果你提前知道時間的價值。如果你沒有,那麼你將要使用動態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 with Demo
所有的查詢返回相同的結果:
| USER | HOMEPHONE | CELLPHONE | EMAIL |
----------------------------------------------
| 123 | 123456 | 456789 | [email protected] |
任何鏈接到以前的職位嗎?我試圖搜索,但沒有找到匹配的帖子。 – user1229404
您也可以考慮在表示層執行此操作,而不是強制SQL Server執行此操作。 –
我今天早些時候回答了這個問題,如果我沒有錯誤 – Woot4Moo