已经存在一视图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