日期:2014-05-18 浏览次数:20586 次
if object_id('[tb]') is not null drop table [tb] go create table [tb]([Id] int,[班级] int,[老师] varchar(2),[任职日期] datetime) insert [tb] select 1,1,'张','2012-01-02' union all select 2,1,'李','2012-04-02' union all select 3,1,'王','2012-05-02' union all select 4,2,'刘','2012-02-02' union all select 5,2,'赵','2012-05-02' go declare @sql varchar(8000) select @sql=isnull(@sql+',','') +'max(case when rn='+ltrim(rn)+' then 老师 end) as [老师'+ltrim(rn)+'],' +'max(case when rn='+ltrim(rn)+' then convert(varchar(10),任职日期,120) end) as [任职日期'+ltrim(rn)+']' from( select distinct rn=(select count(1) from tb where 班级=t.班级 and id<=t.id) from tb t ) t2 exec ('select 班级,'+@sql+' from (' +'select *,rn=(select count(1) from tb where 班级=t.班级 and id<=t.id) from tb t) t2' +' group by 班级' ) /** 班级 老师1 任职日期1 老师2 任职日期2 老师3 任职日期3 ----------- ---- ---------- ---- ---------- ---- ---------- 1 张 2012-01-02 李 2012-04-02 王 2012-05-02 2 刘 2012-02-02 赵 2012-05-02 NULL NULL (2 行受影响) **/
------解决方案--------------------
--> 测试数据:[test] if object_id('[test]') is not null drop table [test] create table [test]( [Id] int, [班级] int, [老师] varchar(2), [任职日期] datetime ) go insert [test] select 1,1,'张','2012-01-02' union all select 2,1,'李','2012-04-02' union all select 3,1,'王','2012-05-02' union all select 4,2,'刘','2012-02-02' union all select 5,2,'赵','2012-05-02' go declare @str varchar(2000) set @str='' select @str=@str+',[教师'+LTRIM(px)+']=max(case when px='+LTRIM(px) +' then [老师] else null end),[任职日期' +LTRIM(px)+']=max(case when px='+LTRIM(px)+' then convert(varchar(10),任职日期,120) else null end)' from ( select px=ROW_NUMBER()over(partition by [班级] order by id), * from test )t group by px exec('select [班级]'+@str+' from(select px=ROW_NUMBER()over(partition by [班级] order by id), * from test)t group by [班级]') /* 班级 教师1 任职日期1 教师2 任职日期2 教师3 任职日期3 1 张 2012-01-02 李 2012-04-02 王 2012-05-02 2 刘 2012-02-02 赵 2012-05-02 NULL NULL */