このタイプのデータ変換は、ピボットと呼ばれます。SQL Server には、SQL Server 2005 からピボット機能があります。
CASE
SQL Server 2005 より前のバージョンでは、次の式を含む集計関数を使用してこれを行うことができました。
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 |