注册 登录
编程论坛 VFP论坛

求:每条记录中各字段的值出现的次数

yd1954 发布于 2021-06-24 09:46, 2332 次点击
各位老师好!
发过去2个表,分列统计15期
             3d积累个数
求:分列统计15期表每条记录中,字段N1--N190范围内,各字段的值在该范围内发生的次数(横向统计)。
    并将统计结果(每个值的发生次数)放在3d积累个数表的相对应的字段。
  3d积累个数表的字段J70--J190,是前表N1--N190 发生数值的区间。也就是说分列统计15期N1--N190各字段的值在70--190之间(用select 单句命令统计的结果)。

举例:分列统计15期最后一行N1的值是114,在N1--N190中出现8次。在3d积累个数j114字段记8,
                          N2的值是131,在N1--N190中出现5次。在3d积累个数j131字段记5
.....

 3d积累个数里有一条记录,是我手工统计录入的。以供参考。
分列统计15期表,有4655条记录,只统计4000行就行,前655行不用统计。
谢谢各位老师!

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

[local]2[/local]
13 回复
#2
吹水佬2021-06-24 11:17
“3d积累个数”文件不见了
#3
yd19542021-06-24 11:43
回复 2楼 吹水佬
只有本站会员才能查看附件,请 登录
#4
xuminxz2021-06-24 12:51
第893条记录中的N33的值是195,其统计结果放在哪?还是超过190的就不统计?或者是增加字段?
#5
yd19542021-06-24 16:04
回复 4楼 xuminxz
可以不做统计,190以上的出现概率太小了。
#6
xuminxz2021-06-24 16:37
程序代码:
Close Tables All
Select * From 分列统计15期 Into Cursor sj Readwrite
Use 3d积累个数 Alias  tj In 0
Zap  In tj
SELECT sj
For i=656 To Reccount()
    Select sj
    Go i
    Scatter Fields qihao,h1,h2,h3 To bzar
    Select tj
    Append From Array bzar
    For j=1 To 190
        Select sj
        zdnr=Evaluate('N'+Alltrim(Str(j)))
        itj=1
        If BETWEEN(zdnr,70,190)
            For k=j+1 To 190
                zdmc='N'+Alltrim(Str(k))
                If Evaluate('N'+Alltrim(Str(k)))=zdnr
                    itj=itj+1
                    Blank Fields &zdmc
                Endif
            Endfor
        zdmc='j'+Alltrim(Str(zdnr))
    Replace &zdmc With itj IN tj
    Endif
    Endfor
Endfor
#7
yd19542021-06-24 22:15
回复 6楼 xuminxz
xuminxz老师,你好!
非常感谢你的帮助。
你编的程序,对分列统计15期表运行顺利,就是慢了点,运行一次约3分钟。
有一个问题,我把程序套用到其它表,我把程序中的表名称改了,同时把字段编号也改了,运行结果是所有的字段都显示为1。
复制个数1表的结构和分列统计15期相同,只是字段名中序号不同,N191--N380.3d记录个数1也是一样。
同样的表有16个,字段名序号从N1到N3003,。因为VF的表只能有255个字段,所以我把1--3003分成16份,每份190个。
恳请xuminxz老师帮助我把程序中的字段名的变量改写一下。
我是一个退休老头,大学学的是中文。现在借助帮助,大学教材,才能勉强看程序,但还不能理解程序语言,不能用中文把程序中的语句表达出来。

下面是我在你的程序上做的改动

Close Tables All
Select * From 复制个数1 Into Cursor sj Readwrite
Use 3d积累个数1 Alias  tj In 0
Zap  In tj
SELECT sj
For i=656 To Reccount()
    Select sj
    Go i
    Scatter Fields qihao,h1,h2,h3 To bzar
    Select tj
    Append From Array bzar
    For j=191 To 380
        Select sj
        zdnr=Evaluate('N'+Alltrim(Str(j)))
        itj=1
        If BETWEEN(zdnr,70,190)
            For k=j+191 To 380
                zdmc='N'+Alltrim(Str(k))
                If Evaluate('N'+Alltrim(Str(k)))=zdnr
                    itj=itj+1
                    Blank Fields &zdmc
                Endif
            Endfor
        zdmc='j'+Alltrim(Str(zdnr))
    Replace &zdmc With itj IN tj
    Endif
    Endfor
Endfor

运行后,结果全是1。
再次表示感谢!

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

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


#8
sdta2021-06-25 09:53
程序代码:

CLOSE DATABASES
t1 = SECONDS()
USE 3d积累个数 IN 0 ALIAS d3
ZAP
lczdm = "Qihao, H1, H2 , H3"
FOR lnj = 1 TO 190
    lczdm = lczdm + ", N" + TRANSFORM(lnj)
ENDFOR
SELECT &lczdm FROM 分列统计15期 WHERE RECNO() > 655 INTO CURSOR test
SCAN
    SCATTER FIELDS LIKE Q*, H* TO la0
    SCATTER FIELDS LIKE N* TO la1
    INSERT INTO d3 FROM ARRAY la0
    FOR lnj = 1 TO ALEN(la1)
        IF BETWEEN(la1[lnj], 70, 190)
            REPLACE ("J" + TRANSFORM(la1[lnj])) WITH EVALUATE("J" + TRANSFORM(la1[lnj])) + 1 IN d3
        ENDIF
    ENDFOR
ENDSCAN
MESSAGEBOX("用时:" + TRANSFORM(SECONDS() - t1) + " 秒")
SELECT d3
BROWSE
#9
吹水佬2021-06-25 11:31
程序代码:
USE 3d积累个数1 ALIAS d3
ZAP
DIMENSION arr[FCOUNT()]
SELECT 0
USE 分列统计15期 ALIAS fs
*USE 复制个数1 ALIAS fs
nEnd = FCOUNT()
FOR nBegin=1 TO nEnd
    IF UPPER(LEFT(FIELD(nBegin),1))=="N"
        EXIT
    ENDIF
ENDFOR
SCAN FOR RECNO()>655
    STORE 0 TO arr
    SCATTER FIELDS qihao,h1,h2,h3 TO arr
    FOR i=nBegin TO nEnd
        n = EVALUATE(FIELD(i)) - 65
        IF BETWEEN(n, 5,125)
            arr[n] = arr[n] + 1
        ENDIF
    ENDFOR
    INSERT INTO d3 FROM ARRAY arr
ENDSCAN
SELECT * FROM d3


[此贴子已经被作者于2021-6-25 11:38编辑过]

#10
xuminxz2021-06-25 16:30
回复 7楼 yd1954
For k=j+191 To 380
应该改为
For k=j+1 To 380
#11
yd19542021-06-25 20:09
回复 9楼 吹水佬
吹水佬老师,你好!
程序运行了,非常好!
如果能将 3d积累个数(统计结果)表中的0都不显示,只显示大于等于1的值,就更好了。观察更直观。
恳请老师帮忙改一下。
非常感谢!
#12
吹水佬2021-06-25 20:46
回复 11楼 yd1954
用BROWSE或GRID可以不显示0
SELECT d3
GO TOP
BROWSE NAME ob NOWAIT
ob.SetAll("format","Z","column")
#13
yd19542021-06-26 20:10
回复 12楼 吹水佬
吹水佬老师,你好!
不好意思。今天忙了一整天,到现在才给你回复。
消除0的句子,我加在程序的最后。运行顺利。但是把h1,h2,h3的0也除掉了。
麻烦老师再改一下。
非常非常感谢
#14
吹水佬2021-06-26 20:18
回复 13楼 yd1954
接着加多3句
ob.column2.format = ""
ob.column3.format = ""
ob.column4.format = ""
1