矩阵转换

 

-- 测试数据   
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 , 1 , '' )     
    ,
@s4 = stuff ( @s4 , 1 , 1 , '' )     
    ,
@s5 = stuff ( @s5 , 1 , 15 , '' )    
  
select   *   from  tb

/*
O    X    Y    Z
---------------------------
A    x1    y1    z1
B    x2    y2    z2
C    x3    y3    z3
*/

exec ( ' declare  ' + @s1 + '      
      select   
' + @s2 + '      
      select   
' + @s3 + '      
      from   tb     
      select   
' + @s4 + '      
      exec(
' + @s5 + ' ) ' )  
  
/*  
O    A    B    C
-------------------------------
X    x1    x2    x3
Y    y1    y2    y3
Z    z1    z2    z3
*/



drop     table    tb     
 


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值