求一SQL语句,高手请进! ( 积分: 10 )

  • 主题发起人 主题发起人 zpselect
  • 开始时间 开始时间
Z

zpselect

Unregistered / Unconfirmed
GUEST, unregistred user!
求出学业生成绩中,总成绩排名在第10名至第20名之间资料
姓名 科目 成绩
张三 语文 60
张三 数学 70
张三 英语 80
李四 语文 66
李四 数学 82
李四 英语 88
。。。 。。。 。。。
结果如下:(第10名至第20名之间的学生资料,总成绩相等,则并列显示!)

姓名 总成绩
李四 236
张三 210
。。。 。。。
 
select 姓名, Sum(成绩) as 总成绩 from ... group by 姓名
 
应该用having吧,有一定难度
 
总成绩相同要求并列排列
 
告诉我并列成什么样
 
总成绩相同,并列显示怎么做?
 
select 姓名 ,sum(成绩) 总成绩
from 学业成绩
group by 姓名
oder by sum(成绩)
where rownum >10 and rownum<20
 
select top 10 with ties * from (select 姓名,SUM(成绩) as 总成绩 from .. group by 姓名)c
where c.总成绩<'' and c.总成绩>'' order by c.总成绩 desc

十名到二十名的总成绩的范围很好算的
 
TO duxing
rownum,怎么来的?
并列的情况如下:
如果 五二,和黄三的总成绩都为220分,那么这两个人的排名都为同一名次!
各位注意:
第10名到20名之间的学生,不一定只有10个学生,可能会很多,也就是说在10名至20名这一排名中可能有三十个学生的成绩在这区间之内!
 
select * from (
select (
select count(*) + 1 from (
select 姓名,sum(成绩) as CJ from 表 group by 姓名
) b where a.CJ < b.CJ
) mc,* from (
select 姓名,sum(成绩) as CJ from 表 group by 姓名
) a
) c
where mc between 10 and 20
order by mc
 
select * from student where sum(..) between
{
select distinct top 21 * from student
group by studentname
order by sum(..) asc 取一条记录是第21名
}
and
{
select distinct top 9 * from student
group by studentname
order by sum(..) asc 取一条记录是第9名
}
order by sum(..) desc
 
注意:
10名到20名的学生资料,不一定只有10笔记录,也就是说这10名之内很有可能有总成绩相同的,总成绩相同的学性并列地排列在某个名次,所以说不能单用TOP来得出结果。
 
这个问题用一个sql来实现估计不易,需要写存储过程,把不同纪录合并到一条纪录上。
不过如果你用ORACLE,倒可以一条语句实现

select case when min(Length(sys_connect_by_path(姓名,',')))=1 then N''
else Ltrim(max(sys_connect_by_path(姓名,',')),',') end 同一成绩人员,
total

from
(
select wid,
姓名,
total,
row_num+(row_number() over(order by row_num)) node_id,
row_number() over(partition by total order by wid) rn
from
(select 0 wid,
a.*
from
(select
姓名,
sum(成绩) total
from 成绩表
group by 姓名) a
order by a.total )

)
)
start with rn =1
connect by (node_id-1 = prior node_id) and (prior total=total)
group by total
 
还有没有别的什么SQL语句?
 
先创建一个这样的临时表
CREATE TEMPORARY TABLE Temp_FsMc (
Cj decimal(8,2) default '0.00', Mc int(5) NOT NULL auto_increment,
PRIMARY KEY (Mc) ) ENGINE=InnoDB DEFAULT CHARSET=gbk
select Cj,Null as Mc from(select sum(成绩) as Cj from 学生成绩表 group by 姓名)
as a group by Cj DESC
再写下列SQL语句
select a.姓名,a.成绩,b.Mc from
(select 姓名,sum(成绩)as Cj from 学生成绩表 group by 姓名)as a left join
Temp_FsMc as b on a.Cj=b.Cj and b.Mc>9 and b.Mc<21
 
要用游标的方式统计才行,前10名也可能总分数相同的,11-20名之间也有可能有总分数相同的学生,所以所前10名不单只有10个学生,而11名至20名之间总分数也不单只有10学生!
 
select id,sum(score) s from test3 group by id having sum(score)=any(
select distinct top 10 sum(score) s from test3 group by id
having sum(score) not in
(select distinct top 50 sum(score) s from test3 group by id order by s desc)
order by s desc
) order by s desc
--查询第51-60名总成绩
 
用存储过程吧,结果INTO 到另外一个表也可以啊。应该更简单实现
 
select a.姓名,b.zf from (
select *,sum(成绩)as zf from 学生成绩表 group by 姓名)as a
inner join (select distinct zf from(
select sum(成绩)as zf from 学生成绩表 group by 姓名 order by zf desc
)as c limit 10,10) as b on a.zf=b.zf order by zf desc
说明:先求出11-20名的唯一总分(ZF),再用inner join合并姓名
 
select * from
(
select 姓名, 总成绩, 名次=(select count(distinct 总成绩)+1 from #t1 where 总成绩>t.总成绩)
from (select 姓名, sum(成绩)as 总成绩 from 表 group by 姓名) t

)a
where a.名次 between 10 and 20
 
后退
顶部