有一个表,描述班次和时段的关系
班次              时段
工厂白班          工厂白班上午
工厂白班          工厂白班下午
工厂白班          工厂白班加班
职能白班          职能白班上午
职能白班          职能白班下午
职能白班          职能白班加班

现在要将这个进行一个转换    我要得形式是
时段1              时段2               时段3
工厂白班上午       工厂白班下午        工厂白班加班
职能白班上午       职能白班下午        职能白班加班
。。
怎么写sql

解决方案 »

  1.   

    [sql server] 行转列问题总结1 - 行转列 
    http://blog.csdn.net/xys_777/archive/2010/06/22/5685953.aspx
      

  2.   

    create table tb(班次 varchar(20),时段 varchar(20))
    insert into tb values('工厂白班', '工厂白班上午')
    insert into tb values('工厂白班', '工厂白班下午')
    insert into tb values('工厂白班', '工厂白班加班')
    insert into tb values('职能白班', '职能白班上午')
    insert into tb values('职能白班', '职能白班下午')
    insert into tb values('职能白班', '职能白班加班')
    godeclare @sql varchar(8000)
    set @sql = 'select 班次 '
    select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then 时段 else '''' end) [时段' + cast(px as varchar) + ']'
    from (select distinct px from (select t.* , px = (select count(1) from tb where 班次 = t.班次 and 时段 < t.时段) + 1 from tb t)m) as a
    set @sql = @sql + ' from (select t.* , px = (select count(1) from tb where 班次 = t.班次 and 时段 < t.时段) + 1 from tb t) m group by 班次'
    exec(@sql) drop table tb/*
    班次                   时段1                  时段2                  时段3                  
    -------------------- -------------------- -------------------- -------------------- 
    工厂白班                 工厂白班加班               工厂白班上午               工厂白班下午
    职能白班                 职能白班加班               职能白班上午               职能白班下午
    */