sql查询一表中相纪录并计算

来源:百度知道 编辑:UC知道 时间:2024/05/22 16:14:42
name Chinese English politics yeartime class
a 80 60 78 2008年 一(1)班
b 70 87 96 2008年 一(2)班
c 56 45 90 2007年 二(1)班
d 45 78 67 2006年 四(1)班
e 45 68 90 2008年 二(3)班
f 88 90 78 2007年 三(1)班
e 77 66 55 2008年 二(1)班
通过查询获得相同年度,相同班级,前五名数据,查询前五名结果如下(下面末经整理,数据不正确)
name Chinese English politics yeartime class
a 80 60 78 2008年 一(1)班
b 70 87 96 2008年 一(1)班
c 56 45 90 2007年 二(1)班
d 45 78 67 2006年 二(1)班
e 45 68 90 2008年 二(3)班
f 88 90 78 2007年 三(1)班
e 77 66 55 2008年 二(2)班
然后计算单科前五名的平均分,结果显示如下(以下数据未计算)
class englishavg5 chineseavg5 yeartime
一(1)班 45 78 2008
一(2)班

一、一步完成:

一个视图解决问题了。如果要增加课程序,只需复制增加UNION连接的子句就行了,其它部份无需更改。
create view viewtop5avg as
select yeartime,class,km,top5avg=avg(cj) from
( select * from ( select name,cj=english,km='english',yeartime,class,sn=(select count(1)+1 from tablename e where e.english>tablename.english and e.yeartime=tablename.yeartime and e.class=tablename.class) from tablename ) ea where sn<=5 union
select * from ( select name,cj=chinese,km='chinese',yeartime,class,sn=(select count(1)+1 from tablename e where e.chinese>tablename.chinese and e.yeartime=tablename.yeartime and e.class=tablename.class) from tablename ) ca where sn<=5 union
select * from ( select name,cj=politics,km='politics',yeartime,class,sn=(select count(1)+1 from tablename e where e.politics>tablename.politics and e.yeartime=tablename.yeartime and e.class=tablename.class) from tablename ) pa where sn<=5
) detail group by yeartime,class,km
--==============