名次排列的问题(200分)

  • 主题发起人 主题发起人 ljbXS
  • 开始时间 开始时间
不要用 order

要考虑

分数 相同 时 的 并列 名次

//以前被 整过
 
名次<>顺序
 
对阿,所以我在上面是这样比较啊
select count(*)+1 where score> myscore
这样就能保证就是排名啊
比如 100,99,99,98。。。
这样100分排第一,而99排第二 ,98则第四。。。。
 
select name,lesson,score,total,
(select count(*)+1 from students b
where name<>'王五' and lesson=a.lesson and b.total>a.total) count
from students a
where name='王五'

 
lvxq, 视图我不会,我新建了一个数据库放这个人的课程,
然后在一门一门的比较,我是一个单位,有500人左右,80多门课,
数据多了这样结果会有,但很慢。
还有,我取的名次是经过排列的记录号,也就是第一条记录是第一名,
两个成绩相同就不行了,还有什么好办法???
分我有如果不够我可在加!!!
 
名次<>顺序
 
select a.姓名 , a.课程 , a.成绩, a.学分, a.总成绩, max(b.名次)
from tablename a,
(select 姓名 , 课程 , 成绩, (count(*)+1)as 名次 from tablename where 成绩>a.成绩 )b
group by a.姓名 , a.课程 , a.成绩, a.学分, a.总成绩
 

什么叫视图不会啊,我刚看了一下,所谓的视图就是在Acess中就是叫查询
你打开Acess,然后选择查询,新建,选择设计视图,确定,然后等画面出来
你可以加入你的那张表。然后在主菜单上选择视图==》SQL视图

在里面打入创建View所需要的sql语句
比如
SELECT 姓名, 课程, 成绩
FROM 表1
WHERE class='数学';
{其中表1是你的表名,然后保存为名字叫 “数学视图”}

然后在delphi中,或者直接在Acess中你就可以直接使用这个"数学视图",就
象使用一个表一模一样。

SELECT 数学视图.姓名, 数学视图.课程, 数学视图.成绩,
(SELECT Count(*)+1 FROM 表1
WHERE 表1.成绩>数学视图.成绩
AND (表1.课程)=数学视图.课程) AS 真实名次
FROM 数学视图
WHERE (((数学视图.姓名)='王'));

上述代码在Acess中通过并正常,

 
有是数据库???!!!
 
lvxq, 谢谢你,视图我会建了,但是下一步在中通不过;报错如下:
Invalid use of keyword
token: 数学视图
Line number :1 ////这个错没了
我这大概有80多门课,不要让我建80个视图!!!

SELECT 数学视图.姓名, 数学视图.课程, 数学视图.成绩,
*****(SELECT Count(*)+1 FROM 表1
运行到*****这有错。
 
DELPHI对中文烦感,你把视图的名字以及字段名都用英文算了。
 
kingdeezj
我的英语不好,给用户看要是中文的,用中文能省好多事!!!
 
否则会很麻烦,而且效率不高的代码又会影响速度,因此我觉得如果可以
你不访创建80多个,反正你是在Delphi中运行,也不影响使用啊
如果还嫌麻烦,你可以在delphi中动态创建比如
Create View as MathView
(
select * from db1 where <条件>
.....
)
或者你自己先某门功课的数据放入一临时表,然后再来,我的建议是这样
不过实现一个目的可能会有很多方法,你自己选个好的吧
 
你把View的名字改成英文(字母),不需要你懂多少英语
而且这根你客户无关,不跟它直接接触
 
lvxq,
////找出一个人课程////////
with query1 do
begin
with sql do
begin
close; //
clear;
text:='select * from 档案 where 姓名=:date1';
parambyname('date1').Value:=edit2.Text;
end;
open;
end;
//////rc把课程加入“课程临时”表中////////
query2.Close;
query2.SQL.Clear;
query2.SQL.Add('select * from 课程临时');
query2.Open;
query2.First;
while not query2.Eof do
query2.Delete; ////清空“课程临时”表
query1.First;
while not query1.Eof do
begin
query2.Append;
query2.FieldByName('课程').AsString:=query1.FieldByName('课程').AsString;
query2.Post;
query1.Next;////加入数据
end;
end;

query2.Close;
query2.SQL.Clear;
query2.SQL.Add('select * from 课程临时');
query2.Open;
query2.First;
while not query2.Eof do
begin
i:=query2.FieldByName('课程').AsString;
query1.Close;
query1.SQL.Clear;
query1.SQL.Add('select * from 档案');
query1.SQL.Add('where 课程='+''''+i+'''');
query1.SQL.Add('order by 总分 desc');
query1.Open; ////找出档案中的每一个课程,
query1.First;
j:=0;
while not query1.Eof do
begin
j:=j+1;
if query1.FieldByName('姓名').AsString=edit2.Text then
begin
query1.Edit;
query1.FieldByName('名次').Value:=j;
query1.Post;
query1.Last;
end;
query1.Next;
end;
query2.Next;
end;

with query1 do
begin
with sql do
begin
close; //
clear;
text:='select * from 档案 where 姓名=:date1';
parambyname('date1').Value:=edit2.Text;
end;
open;
end;

我是这样做的.数据多了不行。80个视我可建,如果是"80几"怎么办.
 
这样做,我简直不用细看就知道它需要很长时间了
没有效率
 
lvxq
是没效率,我现在连课程名都不知道。
谢谢你回答哪么多我另开个一个你来拿分,先给50分好不好。
在帮我想一想行不?
 
你先这样吧,等我有点空再帮你一次搞定,先分两次
QueryClass.close;
QueryClass.sql.Clear;
QueryClass.sql.Add('select DISTINCT 名字,课程,成绩,总分 from 档案 where 名字=:IndexName');
QueryClass.ParamByName('IndexName').value=Edit1.Text;
QueryClass.Open;

QueryTurn.Close;
QueryTurn.Sql.Clear;
mySQLStr:='select count(*)+1 as 名次 from 档案 where ,成绩>IndexScore and '+
'课程=IndexClass ';
QueryTurn.sql.add(mySQLStr);
QueryTurn.close;

for i:=0 to QueryClass.RecordCount do
begin
StrName:=QueryClass.FieldByName('名字').asString;
strClass:=QueryClass.FieldByName('课程').asString;
StrScore:=QueryClass.FieldByName('成绩').asString;
Queryturn.ParamByName('IndexClass').value:=strclass;
Queryturn.ParamByName('IndexScore').value:=strScore;
QueryTurn.Open;
StrTurn:=QueryTurn.FieldByName('名次').as String;
QueryTurn.close;
Memo1.Lines.add(StrName+'----'+StrClass+'----'+StrScore+'----'+strturn);
end;

上面的语句没经过测试,不过应该有什么错误,你把变量和控件加一下
我最后用Memo显示,而你自己可以用别的办法
本来想在sql server上建个类是的表再来试。可这两天实在没时间。
打富翁这破玩艺,我在我现在输入的地方按一次ESC键,就把我所有内容清了,
害我打了两遍
 
最新战况,如果你这样做,你可以在一次查询中结束
前提是,你把你当前的档案表有一个遗墨一样的备份
比如下面的档案1


select 名字, 课程,成绩, 总分 ,
(
select count(*)+1 from 档案1
where 档案1.课程=档案.课程
and 档案1.课程>档案.课程
) as 名次
From 档案
Where 名字='王五'
这样可能会好一点,不过看你的备份了
 
后退
顶部