SQL表交叉显示及实现方法

 假设有张学生成绩表(t)如下   
    
          Name   Subject   Result   
          张三   语文  73   
          张三   数学  83   
          张三   物理  93   
          李四   语文  74   
          李四   数学  84   
          李四   物理  94   
    
          想变成     
          姓名   语文   数学   物理   
          张三   73  83  93   
          李四   74  84  94  
ExpandedBlockStart.gif 代码
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  
ExpandedBlockStart.gif 代码
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    行)   

 

 

转载于:https://www.cnblogs.com/Jess/archive/2010/01/25/1656064.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值