行列转换(将表旋转90度)

普通行列转换  
   
  假设有张学生成绩表(t)如下  
   
          Name   Subject   Result  
          张三   语文  73  
          张三   数学  83  
          张三   物理  93  
          李四   语文  74  
          李四   数学  84  
          李四   物理  94  
   
          想变成    
          姓名   语文   数学   物理  
          张三   73  83  93  
          李四   74  84  94  
   
          create   table   #t  
          (  
          Name         varchar(10)   ,  
          Subject   varchar(10)   ,  
          Result     int  
          )  
   
          insert   into   #t(Name   ,   Subject   ,   Result)   values('张三','语文','73')  
          insert   into   #t(Name   ,   Subject   ,   Result)   values('张三','数学','83')  
          insert   into   #t(Name   ,   Subject   ,   Result)   values('张三','物理','93')  
          insert   into   #t(Name   ,   Subject   ,   Result)   values('李四','语文','74')  
          insert   into   #t(Name   ,   Subject   ,   Result)   values('李四','数学','83')  
          insert   into   #t(Name   ,   Subject   ,   Result)   values('李四','物理','93')  
   
          declare   @sql   varchar(8000)  
          set   @sql   =   'select   Name   as   '   +   '姓名'  
          select   @sql   =   @sql   +   '   ,   sum(case   Subject   when   '''   +   Subject   +   '''   then   Result   end)   ['   +   Subject   +   ']'  
          from   (select   distinct   Subject   from   #t)   as   a  
          set   @sql   =   @sql   +   '   from   #t   group   by   name'  
          exec(@sql)    
   
          drop   table   #t  
   
          --结果  
          姓名               数学                 物理                 语文                      
          ----------   -----------   -----------   -----------    
          李四               83                     93                     74  
          张三               83                     93                     73  
     
   
  如果上述两表互相换一下:即  
   
          姓名   语文   数学   物理  
          张三   73  83  93  
          李四   74  84  94  
   
          想变成    
   
          Name   Subject   Result  
          张三   语文  73  
          张三   数学  83  
          张三   物理  93  
          李四   语文  74  
          李四   数学  84  
          李四   物理  94  
   
          create   table   #t  
          (  
          姓名   varchar(10)   ,  
          语文   int   ,  
          数学   int   ,  
          物理   int  
          )  
   
          insert   into   #t(姓名   ,   语文   ,   数学   ,   物理)   values('张三',73,83,93)  
          insert   into   #t(姓名   ,   语文   ,   数学   ,   物理)   values('李四',74,84,94)  
   
          select   姓名   as   Name,'语文'   as   Subject,语文   as   Result   from   #t   union  
          select   姓名   as   Name,'数学'   as   Subject,数学   as   Result   from   #t   union  
          select   姓名   as   Name,'物理'   as   Subject,物理   as   Result   from   #t  
          order   by   姓名   desc    
   
          drop   table   #t  
     
          Name               Subject   Result              
          ----------   -------   -----------    
          张三               数学         83  
          张三               物理         93  
          张三               语文         73  
          李四               数学         84  
          李四               物理         94  
          李四               语文         74  
   
          (所影响的行数为   6   行)   

 

将表旋转90度.  
   
  将下表数据:  
  A                                         b                       c                       d                       e                        
  --------------------   -----------   -----------   -----------   -----------    
  x                                         1                       2                       3                       4  
  y                                         5                       6                       7                       8  
  z                                         9                       10                     11                     12  
   
  转化成如下结果:  
  a                                         x                     y                     z                      
  --------------------   ----------   ----------   ----------    
  b                                         1                     5                     9  
  c                                         2                     6                     10  
  d                                         3                     7                     11  
  e                                         4                     8                     12  
   
  --生成测试数据  
  create   table   test1(A   varchar(20),b   int,c   int,d   int,e   int)  
  insert   into   test1   select   'x',1,2   ,3   ,4  
  insert   into   test1   select   'y',5,6   ,7   ,8  
  insert   into   test1   select   'z',9,10,11,12  
   
   
  --生成中间数据表  
  declare   @s   varchar(8000)  
  set   @s='create   table   test2(a   varchar(20)'  
  select   @s=@s+','+A+'   varchar(10)'   from   test1  
  set   @s=@s+')'  
  exec(@s)  
   
  --借助中间表实现行列转换  
  declare   @name   varchar(20)  
   
  declare   t_cursor   cursor   for    
  select   name   from   syscolumns    
  where   id=object_id('test1')   and   colid>1   order   by   colid  
   
  open   t_cursor  
   
  fetch   next   from   t_cursor   into   @name  
   
  while   @@fetch_status=0  
  begin  
          exec('select   '+@name+'   as   t   into   test3   from   test1')  
          set   @s='insert   into   test2   select   '''+@name+''''  
          select   @s=@s+','''+rtrim(t)+''''   from   test3  
          exec(@s)  
          exec('drop   table   test3')  
          fetch   next   from   t_cursor   into   @name  
  end  
  close   t_cursor  
  deallocate   t_cursor  
   
   
  --查看行列互换处理结果  
  select   *   from   test1  
  select   *   from   test2  
   
  --删除表  
  drop   table   test1  
  drop   table   test2

 

--生成测试数据  
  create   table   test1(姓名   varchar(10),   语文   int,   数学   int,   物理   int)  
  insert   into   test1   select   '张三',   80,   90,   85  
  insert   into   test1   select   '李四',   85,   92,   82  
   
   
  --生成中间数据表  
  declare   @s   varchar(8000)  
  set   @s='create   table   test2(姓名   varchar(10)'  
  select   @s=@s+','+   姓名   +'   varchar(10)'   from   test1  
  set   @s=@s+')'  
  exec(@s)  
   
  --借助中间表实现行列转换  
  declare   @name   varchar(20)  
   
  declare   t_cursor   cursor   for    
  select   name   from   syscolumns    
  where   id=object_id('test1')   and   colid>1   order   by   colid  
   
  open   t_cursor  
   
  fetch   next   from   t_cursor   into   @name  
   
  while   @@fetch_status=0  
  begin  
          exec('select   '+@name+'   as   t   into   test3   from   test1')  
          set   @s='insert   into   test2   select   '''+@name+''''  
          select   @s=@s+','''+rtrim(t)+''''   from   test3  
          exec(@s)  
          exec('drop   table   test3')  
          fetch   next   from   t_cursor   into   @name  
  end  
  close   t_cursor  
  deallocate   t_cursor  
   
   
  --查看行列互换处理结果  
  select   *   from   test1  
  select   *   from   test2  
   
  --删除表  
  drop   table   test1  
  drop   table   test2  
   
  /*result  
  姓名                   语文                 数学                 物理                      
  ----------   -----------   -----------   -----------    
  张三                   80                     90                     85  
  李四                   85                     92                     82  
   
  (所影响的行数为   2   行)  
   
  姓名                   张三               李四                    
  ----------   ----------   ----------    
  语文                   80                   85  
  数学                   90                   92  
  物理                   85                   82  
   
  (所影响的行数为   3   行)  
  */   

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值