姓名 科目 成绩
zhang A 86.5
wang B 78
zhang B 77
li C 93.5
zhao D 58
zhao A 69.5
zhang C 73
wang C 80
li B 68.5
li D 90
zhang D 74
wang A 77.5
li A 43
zhao B 86
zhao C 100
wang D 70如何通过上表生成zhang全部科目成绩的一个统计,如下:
科目 成绩 名次 前三名
A 86.5 1 zhang wang zhao
B 77 3 zhao wang zhang
C 73 4 zhao li wang
D 74 2 li zhang wang求救!!这个SQL语句应该怎么写??
zhang A 86.5
wang B 78
zhang B 77
li C 93.5
zhao D 58
zhao A 69.5
zhang C 73
wang C 80
li B 68.5
li D 90
zhang D 74
wang A 77.5
li A 43
zhao B 86
zhao C 100
wang D 70如何通过上表生成zhang全部科目成绩的一个统计,如下:
科目 成绩 名次 前三名
A 86.5 1 zhang wang zhao
B 77 3 zhao wang zhang
C 73 4 zhao li wang
D 74 2 li zhang wang求救!!这个SQL语句应该怎么写??
解决方案 »
- 春节散分,顺祝战友们全家身体健康,兔年吉祥如意
- 导入一个vb写得dll(已注册) 没有再import ActiveX列表里显示? 能否把它做成dpk包 继承里面得类 访问里面得函数 ?
- delphi编译时出现access violation at 0x004ec1a0:other of address 0x004ec1a0这个信息,这会是什么错误???
- 高分求助----关于ORACLE中Longraw类型图片的存取问题
- 求助image装入图片文件后,该文件不能进行任何操作的问题。
- delphi mssagedlg
- 如何使图片存贮突破32k限制?
- 急~~~~~Delphi编的系统/////万分感谢!!!
- DBGrid 的SelectIndexChange事件
- richardsong(白玉老虎) 是不是只汉化了菜单的那一种?那里能够下载?
- 请高手帮忙用Delphi翻译以下代码!谢谢!
- 我的程序已经写好了,但换1台机子却报错,第1次,请大虾们帮帮小弟的忙啊!!!!
并没有要求必须用一条SQL语句来实现,但应尽量避免使用游标,因为游标太耗资源了!
另外,临时表也是可以考虑的。欢迎大家继续跟贴关注,谢谢了!!
(select count(b.*) from tableA b where a.科目=b.科目 and b.成绩>=a.成绩) as 名次,
gettopstud(a.科目,3) as 前三名
from tableA a
where 姓名=zhang//gettopstud你自己写个自定义函数,返回某个科目前几名的人员列表
select 'zhang', 'A', '86.5'
union all select 'wang' , 'B', '78'
union all select 'zhang' , 'B', '77'
union all select 'li' , 'C', '93.5'
union all select 'zhao' , 'D', '58'
union all select 'zhao' , 'A', '69.5'
union all select 'zhang' , 'C', '73'
union all select 'wang' , 'C', '80'
union all select 'li' , 'B', '68.5'
union all select 'li' , 'D', '90'
union all select 'zhang' , 'D', '74'
union all select 'wang' , 'A', '77.5'
union all select 'li' , 'A', '43'
union all select 'zhao' , 'B', '86'
union all select 'zhao' , 'C', '100'
union all select 'wang' , 'D', '70'create table #排名表(科目 char, 成绩 float, 名次 int, 前三名 varchar(20))
insert into #排名表(科目, 成绩, 名次)
select 科目, 成绩,
(select count(t2.姓名) + 1 from #temp t2 where t2.科目 = t1.科目 and t2.成绩 > t1.成绩) as 名次
from #temp t1
where 姓名 = 'zhang'declare @lessons varchar(255), @names varchar(255), @one_lesson char
set @lessons = ''
select @lessons = @lessons + ',' + 科目 from #排名表
while @lessons <> ''
begin
set @one_lesson = right(@lessons, 1)
set @names = ''
set nocount on
set rowcount 3
select @names = @names + ' ' + 姓名 from #temp where 科目 = @one_lesson order by 成绩 desc
set rowcount 0
set nocount off
update #排名表 set 前三名 = @names where 科目 = @one_lesson
set @lessons = left(@lessons, len(@lessons) - 2)
endselect * from #排名表drop table #排名表
drop table #temp
---- ----------------------------------------------------- ----------- --------------------
A 86.5 1 zhang wang zhao
B 77.0 3 zhao wang zhang
C 73.0 4 zhao li wang
D 74.0 2 li zhang wang(所影响的行数为 4 行)
---- ------------------------------- ----------- --------------------
A 86.5 1 zhang wang zhao
B 77.0 3 zhao wang zhang
C 73.0 4 zhao li wang
D 74.0 2 li zhang wang(所影响的行数为 4 行)
create function f_str(@a1 varchar(10))
returns varchar(8000)
as
begin
declare @re varchar(8000)
set @re=''
select top 3 @re=@re+','+姓名 from table3 where 科目=@a1
return(stuff(@re,1,1,''))
end--2.查询
declare @xm varchar(20)
set @xm='zhang'
select x.科目, @xm, (select 成绩 from table3 where 科目=x.科目 and 姓名=@xm) as 成绩,
(select count(*) +1 from table3 where 科目=x.科目 and 成绩>
(select 成绩 from table3 where 科目=x.科目 and 姓名=@xm)) as 名次, dbo.f_str(x.科目) as 前三名
from
(select distinct 科目 from table3) x
--1.创建函数
create function f_str(@a1 varchar(10))
returns varchar(8000)
as
begin
declare @re varchar(8000)
set @re=''
-- select top 3 @re=@re+','+姓名 from table3 where 科目=@a1
-- 按成绩降序排,取前三名
select top 3 @re=@re+','+xm from table3 where km=@a1 order by cj desc return(stuff(@re,1,1,''))
end--2.查询
declare @xm varchar(20)
set @xm='zhang'
select x.科目, @xm, (select 成绩 from table3 where 科目=x.科目 and 姓名=@xm) as 成绩,
(select count(*) +1 from table3 where 科目=x.科目 and 成绩>
(select 成绩 from table3 where 科目=x.科目 and 姓名=@xm)) as 名次, dbo.f_str(x.科目) as 前三名
from
(select distinct 科目 from table3) x