注册 登录
编程论坛 VFP论坛

如何对每条记录前3位成绩进行排序,并将结果保存在对应的px字段中

王咸美 发布于 2025-03-11 10:53, 524 次点击


我想对每条记录成绩前3位的学科进行排名,并将结果(字段名)保存在字段px 中,不知如何操作,请高手赐教,万分感谢!!!

CREATE dbf tt(xm C(12),语文n(5,1),数学n(5,1),英语 n(5,1),物理 n(5,1),化学n(5,1),历史 n(5,1),地理 n(5,1),政治 n(5,1),生物n(5,1),pc C(20))
INSERT INTO tt values("AAA",51,71,56.7,51,11,30,41,70,22,"")
INSERT INTO tt values("AAB",52,78,56.7,89,12,38,48,79,28,"")
INSERT INTO tt values("AAC",53,56,53,81,13,53,45,39,25,"")
INSERT INTO tt values("AAD",54,54,56.7,49,14,31,46,19,22,"")
INSERT INTO tt values("AAE",55,48,56.7,89,15,33,43,29,26,"")


10 回复
#2
easyppt2025-03-11 11:26
你的排序要求 描述不是很清晰

1、记录前3位成绩: 指的是什么?所有学科字段的总成绩吗,如果是,那就加个总分字段,然后按照总分字段排序就可以了
2、结果保存在对应的px字段中:指的是什么结果?顺序序号吗

如果不好描述,你也可以把最终的表是啥样子的贴上来

[此贴子已经被作者于2025-3-11 11:27编辑过]

#3
王咸美2025-03-11 11:41
九科成绩排名前三的学科名称进行排名
如:
xm           px
AAA          数学,政治,英语
#4
easyppt2025-03-11 14:22
程序代码:

Create cursor tt(xm C(12),语文 N(5,1),数学 N(5,1),英语 N(5,1),物理 N(5,1),化学 N(5,1),历史 N(5,1),地理 N(5,1),政治 N(5,1),生物 N(5,1),px C(20))
Insert Into tt Values("AAA",51,71,56.7,51,11,30,41,70,22,"")
Insert Into tt Values("AAB",52,78,56.7,89,12,38,48,79,28,"")
Insert Into tt Values("AAC",53,56,53,81,13,53,45,39,25,"")
Insert Into tt Values("AAD",54,54,56.7,49,14,31,46,19,22,"")
Insert Into tt Values("AAE",55,48,56.7,89,15,33,43,29,26,"")

Select * From ( ;
    select xm,'语文' As xk,语文 As cj From tt Union All ;
    select xm,'数学' As xk,数学 As cj From tt Union All ;
    select xm,'英语' As xk,英语 As cj From tt Union All ;
    select xm,'物理' As xk,物理 As cj From tt Union All ;
    select xm,'化学' As xk,化学 As cj From tt Union All ;
    select xm,'历史' As xk,历史 As cj From tt Union All ;
    select xm,'地理' As xk,地理 As cj From tt Union All ;
    select xm,'政治' As xk,政治 As cj From tt Union All ;
    select xm,'生物' As xk,生物 As cj From tt) As mx Into Curs tmp1

Sele tt
Scan All
    Select Top 3 xk From tmp1 Where tmp1.xm=tt.xm Order By cj Desc Into Array myArr
    Repl px With myArr(1)+','+myArr(2)+','+myArr(3)
Endscan
Browse


建议原始表不要以学科建立字段,把学科和成绩做成子表,然后学生是父表,这样比较合理,后面想增加学科也更方便。结果的表其实就是行转列的形式。通过查询就可以得到。

不用SQL方式,你也可以用冒泡排序法处理,也可以的

[此贴子已经被作者于2025-3-11 14:27编辑过]

#5
王咸美2025-03-11 14:30
谢谢!

#6
王咸美2025-03-11 14:50
程序有点问题,请予指正!谢谢!
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


#7
schtg2025-03-11 18:26
回复 6楼 王咸美
稍微改动一下即可,但是还应该考虑纳入 与第三名 分数相同的学科。
只有本站会员才能查看附件,请 登录

程序代码:
Create cursor tt(xm C(12),语文 N(5,1),数学 N(5,1),英语 N(5,1),物理 N(5,1),化学 N(5,1),历史 N(5,1),地理 N(5,1),政治 N(5,1),生物 N(5,1),px C(20))
Insert Into tt Values("AAA",51,71,56.7,51,11,30,41,70,22,"")
Insert Into tt Values("AAB",52,78,56.7,89,12,38,48,79,28,"")
Insert Into tt Values("AAC",53,56,53,81,13,53,45,39,25,"")
Insert Into tt Values("AAD",54,54,56.7,49,14,31,46,19,22,"")
Insert Into tt Values("AAE",55,48,56.7,89,15,33,43,29,26,"")

Select * From ( ;
    select xm,'语文' As xk,语文 As cj From tt Union All ;
    select xm,'数学' As xk,数学 As cj From tt Union All ;
    select xm,'英语' As xk,英语 As cj From tt Union All ;
    select xm,'物理' As xk,物理 As cj From tt Union All ;
    select xm,'化学' As xk,化学 As cj From tt Union All ;
    select xm,'历史' As xk,历史 As cj From tt Union All ;
    select xm,'地理' As xk,地理 As cj From tt Union All ;
    select xm,'政治' As xk,政治 As cj From tt Union All ;
    select xm,'生物' As xk,生物 As cj From tt) As mx Into TABLE _tmp1

Sele tt
Scan All
    Select Top 3 xk From _tmp1 Where _tmp1.xm=tt.xm Order By cj Desc Into Array myArr
    Repl px With myArr(1)+','+myArr(2)+','+myArr(3)
Endscan
Browse



[此贴子已经被作者于2025-3-11 18:32编辑过]

#8
王咸美2025-03-11 18:48
@schtg 谢谢指导!
字段数值相同的视为同一名次。
第3条记录 px 应显示
        物理,数学,语文,英语,历史

如何达到上述效果,请赐教!谢谢!
        
#9
easyppt2025-03-12 08:20
VFP9环境下,代码是没问题的,你是VFP几?

用 table 关键字,会创建本地表,用cursor是临时表,VFP9下,临时用的表不应该用table
如果你用的是低版本,建议升级到VFP9_7423

我当初就是从VFP6直接跳到这个版本的


相同的名次都显示的话,那么排名 px,你怎么知道,哪些是第一,哪些是第二,哪些是第三 ?
要是考虑并列,那还不如把px分解成3个字段,分别用来表示 前3名,然后并列的都显示在对应的名次字段中

[此贴子已经被作者于2025-3-12 08:26编辑过]

#10
王咸美2025-03-12 09:41
我用的是VFP9.0版本的
#11
nybdx2025-03-27 10:43
学习了
1