- 爱易网页
 
                        - 
                            MSSQL教程
 
                        - 一句高难度的T-SQL,该怎么解决 
 
                         
                    
                    
                    日期:2014-05-18  浏览次数:20768 次 
                    
                        
                         一句高难度的T-SQL
表如下所示 
 学号               课程               成绩 
 001                  语文                  82 
 001                  数学                  92 
 002                  英语                  66 
 002                  物理                  99 
 003      ..... 
 ..... 
  
 请使用一句sql语句,求每门课程第3名的学生的学号、课程、成绩
------解决方案--------------------
有一表 
 a    b        c 
 7    aa      153 
 9    aa      152 
 6    aa      120 
 8    aa      168 
 5    bb      159 
 7    bb      179 
 8    bb      149 
 9    bb      139 
 6    bb      169 
 对b列中的值来分类排序并分别加一序号,形成一新表 
 px a    b        c 
 1  6    aa      120 
 2  9    aa      152 
 3  7    aa      153 
 4  8    aa      168 
 1  9    bb      139 
 2  8    bb      149 
 3  5    bb      159 
 4  6    bb      169 
 5  7    bb      179 
  
  
 declare @tab table(a int,b varchar(2),c int) 
  
 insert @tab values(7, 'aa ',153) 
 insert @tab values(9, 'aa ',152) 
 insert @tab values(6, 'aa ',120) 
 insert @tab values(8, 'aa ',168) 
 insert @tab values(5, 'bb ',159) 
 insert @tab values(7, 'bb ',179) 
 insert @tab values(8, 'bb ',149) 
 insert @tab values(9, 'bb ',139) 
 insert @tab values(6, 'bb ',169) 
  
 select * from @tab 
  
 select px=(select count(1) from @tab where b=a.b and c <a.c)+1 , a,b,c from @tab a 
 order by b , c  
  
 px          a           b    c            
 ----------- ----------- ---- -----------  
 1           6           aa   120 
 2           9           aa   152 
 3           7           aa   153 
 4           8           aa   168 
 1           9           bb   139 
 2           8           bb   149 
 3           5           bb   159 
 4           6           bb   169 
 5           7           bb   179 
  
 (所影响的行数为 9 行) 
  
  
 在上面例中我们看到,以B分类排序,C是从小到大,如果C从大到小排序,即下面结果: 
 px a    b        c 
 1  8    aa      168 
 2  9    aa      153 
 3  7    aa      152 
 4  6    aa      120 
 1  7    bb      179 
 2  6    bb      169 
 3  5    bb      159 
 4  8    bb      149 
 5  9    bb      139 
  
 declare @tab table(a int,b varchar(2),c int) 
  
 insert @tab values(7, 'aa ',153) 
 insert @tab values(9, 'aa ',152) 
 insert @tab values(6, 'aa ',120) 
 insert @tab values(8, 'aa ',168) 
 insert @tab values(5, 'bb ',159) 
 insert @tab values(7, 'bb ',179) 
 insert @tab values(8, 'bb ',149) 
 insert @tab values(9, 'bb ',139) 
 insert @tab values(6, 'bb ',169) 
  
 select * from @tab 
  
 select px=(select count(1) from @tab where b=a.b and c> a.c)+1 , a,b,c from @tab a 
 order by b , c desc 
  
 px          a           b    c            
 ----------- ----------- ---- -----------  
 1           8           aa   168 
 2           7           aa   153 
 3           9           aa   152 
 4           6           aa   120 
 1           7           bb   179 
 2           6           bb   169 
 3           5           bb   159 
 4           8           bb   149 
 5           9           bb   139 
  
 (所影响的行数为 9 行) 
  
------解决方案--------------------