有数据如下
X  A   1
X  B   2
Y  C   3
如何实现
   A   B   C
X  1   2
Y          3把列横排的效果

解决方案 »

  1.   

    SQL语句之普通行列转换 
     
    假设有张学生成绩表(tb_rowtocol)如下
    Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94想变成 
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94declare @sql varchar(4000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
    from (select distinct Subject from rowtocol) as a
    set @sql = @sql + ' from rowtocol group by name'
    exec(@sql) 
     
    如果上述两表互相换一下:即
    表名(cj)
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94想变成 Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94select 姓名 as Name,'语文' as Subject,语文 as Result from CJ union
    select 姓名 as Name,'数学' as Subject,数学 as Result from CJ union
    select 姓名 as Name,'物理' as Subject,物理 as Result from CJ
    order by 姓名 desc 
     
      

  2.   

    /*引用邹大哥*/
    create table tb( O char(1),X varchar(10),Y varchar(10),Z varchar(10))
    insert tb select 'A','x1','y1','z1'
    union all select 'B','x2','y2','z2'
    union all select 'C','x3','y3','z3'
    go 
    declare @s1 varchar(8000),@s2 varchar(8000) 
     ,@s3 varchar(8000),@s4 varchar(8000),@s5 varchar(8000) 
     ,@i varchar(10) 
    select @s1='',@s2='',@s3='',@s4='',@s5='',@i='0' 
    select @s1=@s1+',@'+@i+' varchar(8000)' 
     ,@s2=@s2+',@'+@i+'=''O='''''+name+'''''''' 
     ,@s3=@s3+' 
     ,@'+@i+'=@'+@i+'+'',[''+cast([O] as varchar)+'']=''''''+cast(['+name+'] as varchar)+''''''''' 
     ,@s4=@s4+',@'+@i+'=''select ''+@'+@i 
     ,@s5=@s5+'+'' union all ''+@'+@i 
     ,@i=cast(@i as int)+1 
    from syscolumns 
    where object_id('tb')=id and colid>1 
    order by colid 
    select @s1=stuff(@s1,1,1,'') 
     ,@s2=stuff(@s2,1,1,'') 
     ,@s3=stuff(@s3,1,5,'') 
     ,@s4=stuff(@s4,1,1,'') 
     ,@s5=stuff(@s5,1,15,'') 
    exec('declare '+@s1+' 
    select '+@s2+' 
    select '+@s3+' 
    from tb 
    select '+@s4+' 
    exec('+@s5+')') 
    /*    print @s1: @0 varchar(8000),@1 varchar(8000),@2 varchar(8000)
    print @s2: @0='O=''X''',@1='O=''Y''',@2='O=''Z'''
    print @s3: @0=@0+',['+cast([O] as varchar)+']='''+cast([X] as varchar)+'''' 
        ,@1=@1+',['+cast([O] as varchar)+']='''+cast([Y] as varchar)+'''' 
        ,@2=@2+',['+cast([O] as varchar)+']='''+cast([Z] as varchar)+''''
    print @s4: @0='select '+@0,@1='select '+@1,@2='select '+@2
    print @s5: @0+' union all '+@1+' union all '+@2        */ 
    --刪除測試環境 
    drop table tb 
    /*--顯示結果
    O    A    B    C    
    ---- ---- ---- ---- 
    X    x1   x2   x3
    Y    y1   y2   y3
    Z    z1   z2   z3
    (所影的行數只有3 行)
    --*/
      

  3.   

    将行转换为列:PIVOT 和UNPIVOT
      

  4.   

    Hopewell_Go(好的在后頭﹗希望更好﹗﹗) ( )
    贴的这个可以   ^0^