if object_id('Tempdb..#Roy') is not null drop table #Roy create table #Roy (a int,b varchar(10),c int,d int) insert #Roy select 1, '小李', 1, 2 union all select 2, '小王', 4, 5 union all select 1, '小李', 3, 4 union all select 2, '小王', 6, 7 union all select 1, '小李', 5, 6 union all select 2, '小王', 8, 9 sql2000实现: begin tran if object_id('tempdb..#roy2') is not null drop table #roy2 select a,b,num,id=identity(int,1,1) into #roy2 --生成临时表 from (select a,b,c as num from #Roy union all select a,b,d from #Roy)a order by b,num asc --排序方式 --动态查询 declare @s nvarchar(1000),@i int select top 1 @i=count(1),@s='' from #roy2 group by a order by count(1) desc while @i>0 select @s=',[Col'+rtrim(@i)+']=max(case when ID='+rtrim(@i)+' then rtrim(num) else '''' end)'+@s,@i=@i-1 exec('select a,b'+@s+ 'from (select a,b,num,ID=(select count(1) from #roy2 where a=a.a and ID<=a.ID) from #roy2 a)T group by a,b') drop table #roy2 rollback tran sql2005: begin tran--开始事务 declare @i int,@s nvarchar(1000),@Col nvarchar(1000) select top 1 @i=count(1),@s='',@Col='' from #roy unpivot (Num for Col in(c,d))b group by a order by count(1) desc while @i>0 select @s=','+quotename(@i)+@s,@Col=',[Col'+rtrim(@i)+']='+quotename(@i)+@Col,@i=@i-1 set @s=stuff(@s,1,1,'') exec('with CTE as (select a,b,num,row=row_number()over(partition by a order by num) from #roy unpivot (Num for Col in(c,d))b) select a,b'+@Col+' from CTE pivot (max(num) for row in('+@s+'))b') rollback tran /* a b Col1 Col2 Col3 Col4 Col5 Col6 ----------- ---------- ----------- ----------- ----------- ----------- ----------- ----------- 1 小李 1 2 3 4 5 6 2 小王 4 5 6 7 8 9 (2 行受影响) */