注册 登录
编程论坛 VFP论坛

查询字段中指定的值和它的 下一行记录

yd1954 发布于 2021-11-26 12:00, 2330 次点击
各位老师好!
发过去一个表:k1
求:表中n1字段中指定的值和它的下一行的查询程序。

例如,n1中,=91的有5个,我用 select n1 from k1 where n1=91 查询,只能显示=91的5条记录。
我想在查询结果中看到=91的全部记录,同时也看到每个91的下一行记录。
 请各位老师帮忙。
谢谢!






只有本站会员才能查看附件,请 登录
16 回复
#2
sdta2021-11-26 13:09
表查询+数组
#3
yd19542021-11-26 13:23
回复 2楼 sdta
sdta老师你好!
感谢你的帮助。你的“表查询+数组”,在我的脑中没有一点思路。请你写出代码。
谢谢!
#4
laowan0012021-11-26 13:30
需要先做一次加工,把记录号变成字段
SELECT RECNO() rec,* FROM k1 INTO CURSOR xx1
SELECT * FROM xx1 WHERE n1=91 UNION ALL SELECT * FROM xx1 WHERE rec in (SELECT rec+1 FROM xx1 WHERE n1=91) ORDER BY rec
#5
wengjl2021-11-26 14:17
以下是引用laowan001在2021-11-26 13:30:28的发言:

需要先做一次加工,把记录号变成字段
SELECT RECNO() rec,* FROM k1 INTO CURSOR xx1
SELECT * FROM xx1 WHERE n1=91 UNION ALL SELECT * FROM xx1 WHERE rec in (SELECT rec+1 FROM xx1 WHERE n1=91) ORDER BY rec

我试了下 ,提示 order by rec 子句无效, 去掉子句可以执行。 win7+vfp8.0
#6
laowan0012021-11-26 14:42
回复 5楼 wengjl
我是VFP9,没报错
如果需要排序的话,先存到表里,然后再排序就行
#7
吹水佬2021-11-26 15:08
只有本站会员才能查看附件,请 登录

程序代码:
USE k1 IN 0 ALIAS a
USE k1 IN 0 ALIAS b AGAIN
SELECT a
SET RELATION TO RECNO()+1 INTO "b"
LIST FIELDS a.n1,b.n1,RECNO("b") FOR a.n1==91
#8
laowan0012021-11-26 15:32
回复 5楼 wengjl
如果不排序的话,n1=91的在前面,所有“下一条”记录在后面,这样可能不满足你的要求
#9
wengjl2021-11-26 16:25
这一句中用了三个 select 第一次见识。
#10
yd19542021-11-27 10:25
回复 4楼 laowan001
非常感谢laowan001老师的帮助。
运行很好。与手动统计结果一致。
基本上没看懂老师写的程序。
以后有问题还要请老师帮助。
再次感谢。
#11
yd19542021-11-27 10:31
回复 7楼 吹水佬
非常感谢吹水佬老师的帮助。
运行很好,与手动统计结果一致。
统计结果如能以表的形式存在,有利于后续再统计。
请老师再帮助一下,将结果以表的形式显示。
#12
吹水佬2021-11-27 11:55
回复 11楼 yd1954
只有本站会员才能查看附件,请 登录

程序代码:
USE k1 IN 0 ALIAS a
USE k1 IN 0 ALIAS b AGAIN
SELECT 0000 记录号,n1 FROM a WHERE .f. INTO CURSOR tmp READWRITE
SELECT a
SET RELATION TO RECNO()+1 INTO "b"
SCAN
    IF a.n1==91
        INSERT INTO tmp VALUES (RECNO("a"),a.n1)
        INSERT INTO tmp VALUES (RECNO("b"),b.n1)
    ENDIF
ENDSCAN
SELECT * FROM tmp
#13
吹水佬2021-11-27 14:30
程序代码:
SELECT 0000 记录号,n1 FROM k1 WHERE .f. INTO CURSOR tmp READWRITE
SELECT k1
DO WHILE !EOF()
    IF n1==91
        INSERT INTO tmp VALUES (RECNO("k1"),k1.n1)
        SKIP
        IF !EOF()
            INSERT INTO tmp VALUES (RECNO("k1"),k1.n1)
        ENDIF
    ENDIF
    IF !EOF()
        SKIP
    ENDIF
ENDDO
SELECT * FROM tmp

#14
吹水佬2021-11-27 14:31
只有本站会员才能查看附件,请 登录

程序代码:
b1 = .f.
SELECT *, RECNO() 记录号 FROM k1 WHERE fun()

FUNCTION fun()
    IF n1==91
        b1 = .t.
        RETURN .t.
    ENDIF
    IF b1
        b1 = .f.
        RETURN .t.
    ENDIF
    RETURN .f.
ENDFUNC
#15
吹水佬2021-11-27 16:04
只有本站会员才能查看附件,请 登录

SELECT RECNO() 记录号,* FROM k1 INTO CURSOR tmp
SELECT a.记录号,a.n1,b.记录号,b.n1 FROM tmp a JOIN tmp b ON a.n1==91 AND a.记录号==b.记录号-1
#16
schtg2021-11-28 06:30
高,谢谢吹水版主!
#17
yd19542021-11-28 08:56
回复 15楼 吹水佬
非常感谢吹水佬老师!
特别是最后的程序,简单,直观,便于后续统计,特别好。
再次感谢!
1