关于排序的问题 (100分)

  • 主题发起人 主题发起人 sundrink
  • 开始时间 开始时间
S

sundrink

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好!
我是个初学者,我在试着写学生成绩查询时遇到了一个问题,
请问如何实现学生名次的排序?名次字段本是空,是要根据成绩
填充的.有没有好一些的法子?
名次排名是这样的,看一下下面的例子:
名次 成绩
1 100
1 100
1 100
4 99
4 99
6 98
 
Select 名次,成绩 from 表 order by 名次,成绩
 
先按名次排序,如果名次相同,则按成绩排序(如果成绩有不同的)
 
同意yzhshi
果然是菜鸟级的问题
 
名次字段本是空,是要根据成绩填充的,看上面的例子。
 
1. If you only want to sort by 成绩, then here is the sample for you:

SELECT 成绩
FROM 表
ORDER BY 成绩 DESC

2. If you really want to add 名次 field, you need to use a temporary table, or
write some code. Let us know if you want to do that, so others can help you.

Enjoy programming!
 
在table加一计算字段,在table的CalcFields事件中查询小于此记录成绩的记录数量,然后...
 
同意楼上的
 
继续征求好法子,若办法有独到之处一定给分!
 
简单!
SELECT 成绩
FROM 表
ORDER BY 成绩 DESC
然后:
query1.first;
i:=1;
while not query1.eof do
begin
query1.fieldbyname('名次').asinteger:=i;
query1.next;
i:=i+1;
end;
(没有考虑'并列'的问题!)
 
SELECT 成绩 //排序
FROM 表
ORDER BY 成绩 DESC
名次开始以纪录号填写,我就不写了
考虑并列的情况
with query do
begin
i:=fieldbyname('名次').asinteger; //保留名次
j:=fieldbyname('分数').value; //保留分数
while not eof do
begin
edit;
if fieldbyname('分数').value=j then
fieldbyname('名次').asinteger:=i;
post;
i:=fieldbyname('名次').asinteger; //保留名次
j:=fieldbyname('分数').value; //保留分数
next;
end;
end;
哎,写的太糟了,算了,你参考把,

 
1、按成绩排序(降序)
2、排名次
算法如下:
procedure sort;
var
mc:integer;
cj:double;
_SQL: string;
begin
_SQL := 'select 成绩,名次 from tableanme order by 成绩 Desc';
Query.Close;
Query.Sql.Clear;
Query.Sql.add(_SQL);
Query.Open;
mc := 1;//这儿必须赋初值
Cj := Query.Fields[0].AsFloat;
while not Query.Eof do
begin
//成绩相等
if (Cj=Query.Fields[0].AsFloat) then
begin
mc := mc;
end
else ///成绩不等
begin
mc := mc+1;
cj := Query.Fields[0].AsFloat;
end;
Query.Edit;
Query.Fields[1].Asinteger := mc;
Query.Post;
Query.Next;
end;

end;
 
后退
顶部