SQL查询难题(高手快来啊)
我建的表如下
table sc (stuid int,subjectid int,score float)
table stu (stuid int,stuname varchar(10),classid int)
table subject (subjectid int,subjectname varchar(10))
你们插入些数据结成
做如下查询,我写了一段了,实现的功能还不全面
-----------------------------------------------------------------------------------------
select (select classid from stu where stu.stuid=sc.stuid) [class],sum(score) 总成绩 into # from sc group by stuid
declare @i0 float,@i1 float,@i2 float,@i3 float,@i4 float,@i5 float,@i6 float,@i7 float,@i8 float,@i9 float,@i10 float
select @i0=avg(总成绩) from # where 总成绩>=660 and 总成绩<=1120
select @i1=avg(总成绩) from # where 总成绩>=650 and 总成绩<=659
select @i2=avg(总成绩) from # where 总成绩>=640 and 总成绩<=649
select @i3=avg(总成绩) from # where 总成绩>=630 and 总成绩<=639
select @i4=avg(总成绩) from # where 总成绩>=620 and 总成绩<=629
select @i5=avg(总成绩) from # where 总成绩>=610 and 总成绩<=619
select @i6=avg(总成绩) from # where 总成绩>=600 and 总成绩<=609
select @i7=avg(总成绩) from # where 总成绩>=550 and 总成绩<=599
select @i8=avg(总成绩) from # where 总成绩>=500 and 总成绩<=549
select @i9=avg(总成绩) from # where 总成绩>=400 and 总成绩<=499
select @i10=avg(总成绩) from # where 总成绩>=0 and 总成绩<=399
select '1120-660' 分数段,@i0 段均分,cast(sum(case when 总成绩>=660 and 总成绩<=1120 then 1 else 0 end) as nvarchar)+'/'+cast(sum(case when 总成绩>=660 then 1 else 0 end) as nvarchar) [年段] from #
union
select '659-650' ,@i1 ,cast(sum(case when 总成绩>=650 and 总成绩<=659 then 1 else 0 end) as nvarchar)+'/'+cast(sum(case when 总成绩>=650 then 1 else 0 end) as nvarchar) from #
union
select '649-640' ,@i2 ,cast(sum(case when 总成绩>=640 and 总成绩<=649 then 1 else 0 end) as nvarchar)+'/'+cast(sum(case when 总成绩>=640 then 1 else 0 end) as nvarchar) from #
union
select '639-630' ,@i3 ,cast(sum(case when 总成绩>=630 and 总成绩<=639 then 1 else 0 end) as nvarchar)+'/'+cast(sum(case when 总成绩>=630 then 1 else 0 end) as nvarchar) from #
union
select '629-620' ,@i4 ,cast(sum(case when 总成绩>=620 and 总成绩<=629 then 1 else 0 end) as nvarchar)+'/'+cast(sum(case when 总成绩>=620 then 1 else 0 end) as nvarchar) from #
union
select '619-610' ,@i5 ,cast(sum(case when 总成绩>=610 and 总成绩<=619 then 1 else 0 end) as nvarchar)+'/'+cast(sum(case when 总成绩>=610 then 1 else 0 end) as nvarchar) from #
union
select '609-600' ,@i6 ,cast(sum(case when 总成绩>=600 and 总成绩<=609 then 1 else 0 end) as nvarchar)+'/'+cast(sum(case when 总成绩>=600 then 1 else 0 end) as nvarchar) from #
union
select '599-550' ,@i7 ,cast(sum(case when 总成绩>=550 and 总成绩<=599 then 1 else 0 end) as nvarchar)+'/'+cast(sum(case when 总成绩>=550 then 1 else 0 end) as nvarchar) from #
union
select '549-500' ,@i8 ,cast(sum(case when 总成绩>=500 and 总成绩<=549 then 1 else 0 end) as nvarchar)+'/'+cast(sum(case when 总成绩>=500 then 1 else 0 end) as nvarchar) from #
union
select '499-400' ,@i9 ,cast(sum(case when 总成绩>=400 and 总成绩<=499 then 1 else 0 end) as nvarchar)+'/'+cast(sum(case when 总成绩>=400 then 1 else 0 end) as nvarchar) from #
union
select '399-0' ,@i10 ,cast(sum(case when 总成绩>=0 and 总成绩<=399 then 1 else 0 end) as nvarchar)+'/'+cast(sum(case when 总成绩>=0 then 1 else 0 end) as nvarchar) from #
drop table #
-----------------------------------------------------------------------------------------
只能得到了年级的,但还想对各个班的在每个分数段的人数,得到的结果要跟年段的类似,这就需要加代码,高手来解决阿,最好把我写的代码也给简化一下(想得到的结果如下)
分数段 段均分 1班 2班 3班 年段
499-400 488.5 2/6 3/4 1/5 6/15