对于这种类型的数据转换,您需要使用 SQL Server 2005+ 中提供的PIVOT 函数。有两种方法可以应用 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 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) |