このタイプのデータ変換PIVOT
では、SQL Server 2005+ で利用可能な関数を使用する必要があります。ピボット機能を適用するには 2 つの方法があります。
事前に値がわかっている場合は、クエリで値をハードコーディングできます。これに似ています:
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 Fiddle with Demoを参照してください。
ただし、列に転置する値の数が不明な場合は、動的 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 with Demoを参照してください。
どちらも同じ結果になります。違いは、値が変更された場合に動的バージョンが柔軟であることです。
| M1 | M2 |
---------------
| U1 | U4 |
| U2 | U5 |
| U3 | (null) |