Для этого типа преобразования данных вы захотите использовать функцию PIVOT
, которая доступна в SQL Server 2005+.Существует два способа применения функции pivot .
Если вы знаете значения заранее, то вы можете жестко закодировать значения в запросе.Аналогично этому:
select M1, M2
from
(
select c1, c2,
row_number() over(partition by c1 order by c1, c2) rn
from yourtable
) src
pivot
(
max(c2)
for c1 in (M1, M2)
) piv
См. Скрипка SQL с демонстрацией .
Но если у вас есть неизвестное количество значений, которые вы хотите транспонировать в столбцы, тогда выможет использовать динамический SQL для создания запроса во время выполнения.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(C1)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select C1, C2,
row_number() over(partition by c1 order by c1, c2) rn
from yourtable
) x
pivot
(
max(C2)
for C1 in (' + @cols + ')
) p '
execute(@query)
См. SQL Fiddle с демоверсией .
Оба будут давать одинаковый результат, разница в том, что динамическая версия гибкая, если значения изменятся:
| M1 | M2 |
---------------
| U1 | U4 |
| U2 | U5 |
| U3 | (null) |