wxysky

eduAdmin

博客园 首页 新随笔 联系 订阅 管理

已经存在一视图A,其显示如下:     
Exam       Name     Grade      Class        Subject     Score       总分级名次 
001          A           2002      -(1)       数学                    80                    1 
001       A           2002         一(1)          语文                 90                    1 
005          E           2002      -(1)       数学                    100                  1 
005       E           2002      一(1)          语文                 70                    1 
002       B           2002      一(1)       数学                    70                    3 
002       B           2002      一(1)       语文                    80                    3 
003       C           2002      一(2)       语文                    73                    2 
003       C           2002      一(2)       数学                    90                    2 
004       D           1999      四(1)       英语                    68                    1 
 
 
  
要求得到如下结果:     
Class                          参考人数                          1至2                        2以后 
一(1)                     3                              2                                1 
一(2)                     1                              1                            Null 
全级                                4                                3                            1 
 
提示: 
若全级的参考人数为7,则会得到以下六列: 
Class  参考人数  1至2  3至4   5至6   6以后 
(即步距为2。) 
 
       高手们,这一个统计结果是否可用存储过程或视图等实现?但我真的不想在程序中做,有办法吗? 
       谢谢!! 
 
 
create  table  依伊尘埃  (Exam  varchar(10),Name  varchar(10),Grade  int,Class  varchar(10),Subject  varchar(10),Score  int,总分级名次  int) 
insert  依伊尘埃  values('001','A',2002,'一(1)','数学',80,1) 
insert  依伊尘埃  values('001','A',2002,'一(1)','语文',90,1) 
insert  依伊尘埃  values('005','E',2002,'一(1)','数学',100,1) 
insert  依伊尘埃  values('005','E',2002,'一(1)','语文',70,1) 
insert  依伊尘埃  values('002','B',2002,'一(1)','数学',70,3) 
insert  依伊尘埃  values('002','B',2002,'一(1)','语文',80,3) 
insert  依伊尘埃  values('003','C',2002,'一(2)','语文',73,2) 
insert  依伊尘埃  values('003','C',2002,'一(2)','数学',90,2) 
insert  依伊尘埃  values('004','D',1999,'四(1)','英语',68,1) 
 
declare  @sql  varchar(8000),@sql1  varchar(1000),@sql2  varchar(1000) 
select  @sql  =  'select  Class,',@sql1='select  *,',@sql2='select  *  from  #大力  union  all  select  ''全级''' 
 
select  @sql1=@sql1+'isnull(['+cast(总分级名次  as  varchar)+'至'+cast(总分级名次+1  as  varchar)+'],0)+', 
@sql2=@sql2+',sum(['+cast(总分级名次  as  varchar)+'至'+cast(总分级名次+1  as  varchar)+'])', 
@sql=@sql+'sum(case  when  总分级名次  between  '+cast(总分级名次  as  varchar)+'  and  '+cast(总分级名次+1  as  varchar)+' 
                                                   then  1  else  null  end)  as  '''+cast(总分级名次  as  varchar)+'至'+cast(总分级名次+1  as  varchar)+''',' 
   from  (select  case  when  总分级名次%2=0  then  总分级名次-1  else  总分级名次  end  总分级名次    from  依伊尘埃  group  by  case  when  总分级名次%2=0  then  总分级名次-1  else  总分级名次  end)  as  a 
 
select  @sql1=left(@sql1,len(@sql1)-1)+'  参考人数  into  #大力  from(', 
@sql=@sql1+left(@sql,len(@sql)-1)+'  from  (select    Class,Exam,总分级名次  from  依伊尘埃  a  where  Class  like  ''一%''    group  by  Class,Exam,总分级名次)  tem  where  Class  like  ''一%''  group  by  Class)  temp1;'+@sql2+',sum(参考人数)  from  #大力' 
 
exec(@sql) 
 
drop  table   

 

posted on 2006-06-23 07:56  无名  阅读(1364)  评论(0编辑  收藏  举报