我有一个数据库,内有成绩等,我要对成绩进行排名并写入成绩表的名次字段,不知如何作。(100分)

  • 主题发起人 主题发起人 千年顽石
  • 开始时间 开始时间

千年顽石

Unregistered / Unconfirmed
GUEST, unregistred user!
[:D]我有一个数据库,内有成绩等,我要对成绩进行排名并写入成绩表的名次字段,不知如何作。
 
select * from 成绩表 order by 成绩 DESC
然后在DATASET中的名字中放入记录号

 
我的库中同时有几个项目的成绩,我是否要一个一个完成还是同时完成。
 
如果你是总成绩排名,SQL语句排序就得按总成绩排序,如果不是,你就得一个一个完成
另外,还得注意分数相同的情况下排名应是一样的,把查询结果从头到尾每条记录判断一
遍,判断当前记录与上一条记录如果同分的话,就把当前记录的名次改成与上一条记录的
名次相同。
 
假设你已经放置一个Table控件Table1,一个Query控件Query1,
你的数据库为“S.db";
Query1的SQL语句如下:
SELECT
名字,成绩
FROM 'S.DB'
ORDER BY 成绩 DESC;
语句执行结果将成绩按降序排序,然后可以直接将Query1的
执行结果输出到其它你放置的显示控件上如DBGrid等,
Query1.answer字段即为名次;

写入名次的语句也可以如下:
var
Mc:String;
Cj:Integer;
begin
Table1.Tablename:=s.db;
Table1.Open;
Table1.First;
Mc:=Table1.FieldByName('名次').AsSting;
Cj:=Table1.FieldByName('成绩').AsInteger;
While not Eof(Table1)
do
begin
Mc:=Query1.FieldByName('ANSWER').AsString;//写入名次;
Table1.Next;
if Cj=Query1.FieldByname('成绩').AsInteger//如果有相同的成绩;
then
begin
Mc:=Query1.FieldByName('ANSER').AsString//将名次与上一个的重复;
end;
Query1.Next;
end;
end;
 
  我是这样解答,你看一下怎么样?

  假设数据表结构是这样的:学号(文本)、姓名(文本)、成绩(单精度)、名次(整数)
  首生,搞清楚解决问题的思路
  1.将数据按成绩倒排序
  2.顺序比较各个学生的与前一名学生成绩。
    如果相同,则与前一名学生同名次
    如果不同,则等于记录号
  
  然后我再编制程序如下:

procedure TForm1.Button1Click(Sender: TObject);
var
sglCj : Single; //记录原成绩
intMC : Integer; //记录当前名次
intJLS : Integer; //记录当前记录数
begin
if aquCJ.Eof then Exit ; //如果没有数据,不能排序

//关闭数据集
if aquCJ.Active then
aquCJ.Close;

//改变SQL语句
aquCJ.SQL.Clear;
aquCJ.SQL.Add('SELECT * FROM CJB ORDER BY CJB.成绩 DESC , CJB.学号');

//打开数据集
aquCJ.Properties;
aquCJ.Open;

//取得第一名成绩
aquCJ.First;
sglCj := aquCJ.FieldByName('成绩').AsFloat;
intMc := 1;
intJLS :=1;

//开始写入名次
while aquCJ.Eof = false do
begin
//如果当前成绩不等于前一名成绩的话,使名次等于记录数
if aquCJ.FieldByName('成绩').AsFloat <> sglCj then intMC := intJLS;
//为名次赋值
aquCJ.Edit;
aquCJ.FieldByName('名次').AsInteger := intMC;
  //再一次取得原成绩
sglCj := aquCJ.FieldByName('成绩').AsFloat;
aquCJ.Post;

aquCJ.Next; //前移记录
intJLS := intJLS + 1 ; //记录数同步
end;

//还原数据集
aquCJ.Close;
aquCJ.SQL.Clear;
aquCJ.SQL.Add('SELECT * FROM CJB');
aquCJ.Properties;
aquCJ.Open;

end;
 
楼上的大侠的那个aquCJ.Properties;
我不明白是什么意思,如果是用ADOQUERY的应该是
aquCJ.execsql ;吧?
 
多人接受答案了。
 
后退
顶部