- 爱易网页
 
                        - 
                            MSSQL教程
 
                        - 一个SQL查询有关问题.小弟初学者一只 
 
                         
                    
                    
                    日期:2014-05-19  浏览次数:20522 次 
                    
                        
                         一个SQL查询问题.小弟菜鸟一只.
 已知有一个记录学生成绩的表,表名叫做“成绩表”,内容如下: 
  
 学号            科目            成绩 
    11               数学               90 
    11               语文               80 
    11               英语               70 
    22               数学               60 
    22               语文               50 
    22               英语               40 
  
 现在想用一条语句,将其搜索成下面的格式 
  
                         数学               语文               英语 
    11                  90                     80                     70 
    22                  60                     50                     40 
  
 一条语句,最好不要用中间表,直接一条语句搜索出来,实在是不知道了,希望大虾们帮帮忙!!!
------解决方案--------------------
普通行列转换 
  
 假设有张学生成绩表(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 
   
 --结果