回 帖 发 新 帖 刷新版面

主题:高老师请进(如何筛选连续三个月以上超标准的记录2)

高老师您好:
    之前我发过一篇求助贴《如何筛选连续三个月以上超标准的记录》,按您的代码我试过后出现一个问题,研究好久没有得解。今天只好继续求教!
首先我将原贴内容粘过来,如下:
------------------------------------------------
有两个数据表,一个为“定额”表,一个为“销售”表。“定额”表中存放所有个体户定额信息,每个个体户仅有一条记录,其中包括字段(定额),每个户的定额不同,例如有6000,或是8000等等;“销售”表中存放个体户各月销售信息,全年下来每个个体户有12条记录(1个月一条),其中包括字段(销售额,月份),每个月销售额也不同。

现在想将两个表按对应户进行统计,“销售”表中连续3个月以上销售额超过“定额”表中对应的个体户的记录,如何写出一个命令或是小程序?

举例:吉祥商店 ,该商店在定额表中“定额”为5000元(定额字段为5000),在“销售”表中,该商店1月份(销售额字段)为5000,2月份为6500,3月份为4500,4月份为4800,5月份为6600,6月份为6500,7月份为6100,8月份为6100,9月份为6000,10月份为5000,11月份为4800,12月份为4900。要求把该商店“销售”表中连续3个月以上超过5000的记录筛选出来。

------------------------------------------------------------------------------
以下是您上次的回答:

你应该给定额表再加个字段,暂且起名:"超额"
假如你的两个表都是打开的,
select 销售表
index on 月份 to myidx
select 定额表
scan
  select 销售表
  set filter to 户名 = 定额表.户名
  for i = 1 to 10
    go i
    if 销售额 >= 定额表.定额
      skip
      if 销售额 >=定额表.定额
         skip
         if 销售额 >=定额表.定额
            select 定额表
            repl 超额 with '是'
            exit
         else
           loop  
         endif
      else
        loop
      endif
    else
      loop 
    endif
  endfor
  select 定额表
ends
set filter to 超额 = '是'
brow
你所看到的是定额表中连续三个月或以上超额的个户
--------------------------------------------------------------------

我如今的做法:
建立三个表,b1(月份,定额,识别号)     b2(月份,销售额,识别号)     b3(识别号,月份1,月份1,月份3,销售额),

我以B1“定额”为准 ,用b2的“销售额”去比,假如连续三个月的销售额大于定额,就将三个月的记录存入于b3中,代码如下:


SET TALK OFF
SET SAFETY OFF
SELECT 1
 USE b1.dbf
 INDEX on yf(月份字段实际是字母) TO a
SELECT 2
 USE b2.dbf
SELECT 3
 USE b3.dbf
SELECT 2
 SCAN
     SELECT 1
         SET FILTER TO sbh=b->sbh
           FOR i=1 TO 10
             m1=0
             m2=0
             m3=0
             GO i
             IF xse>b->de
                m1=MONTH(yf)
                SKIP
                  IF xse>b->de
                    m2=MONTH(yf)
                    SKIP
                      IF xse>b->de
                        m3=MONTH(yf)
                         SELECT 3
                           APPEND BLANK
                           REPLACE yf WITH a->yf,sbh WITH a->sbh,yf1 WITH m1,yf2 WITH m2,yf3 WITH m3
                           EXIT
                     ELSE
                       LOOP
                     ENDIF
                 ELSE
                   LOOP
                 ENDIF
             ELSE
               LOOP
             ENDIF
          ENDFOR
           SELECT 2
 ENDSCAN

举例:
b1             月份              识别号        定额
              2009.01.01           11         5000.00
              2009.01.01           22         5000.00


b2             月份               识别号        销售额
              2009.01.01            11         6000.00
              2009.02.03            11         7000.00
              .......
              2009.12.02            11         4500.00
                    
              2009.01.02            22         5600.00
              2009.02.01            22         6500.00
              .......
              2009.12.03            22         6700.00

但是运行完后,b3里出来的记录是这样的
              识别号        月份1     月份2    月份3     销售额1     销售额2     销售额3
                11            4         5        6         ......
                22            4         4        5        ......
                
经发现,只要这两家连续三个月超定额的月份相同,就会出现这种情况。如果连续三个月超定月份不同,则22就检测不出连续三个月的记录。

请高老师指教。

回复列表 (共8个回复)

沙发

[color=FF0000][b]VFP里请用GOMONTH()代替DATEADD().[/b][/color]

--SELECT A.KHBH,A.KHMC,B.YF,B.XSE INTO #CUR_TMP FROM DEB A LEFT JOIN XSB B ON A.KHBH=B.KHBH 

SELECT * FROM #CUR_TMP

SELECT A.KHBH AS '客户编号',A.KHMC AS '客户名称',A.YF '月份一',A.XSE AS '销售额一',B.YF AS '月份二',B.XSE AS '销售额二',C.YF AS '月份三',C.XSE AS '销售额三' FROM #CUR_TMP A,#CUR_TMP B,#CUR_TMP C
WHERE A.KHBH=B.KHBH AND A.YF=[color=FF0000]DATEADD[/color](MONTH,-1,B.YF) 
AND A.KHBH=C.KHBH AND  A.YF=[color=FF0000]DATEADD[/color](MONTH,-2,C.YF) 
AND A.XSE>5000 AND B.XSE>5000 AND C.XSE>5000




KHBH        KHMC       YF                                 XSE                  
----------- ---------- ------------------------------   --------------------
1           吉祥商店       2009-01-01 00:00:00.000         5000.00
1           吉祥商店       2009-02-01 00:00:00.000         4900.00
1           吉祥商店       2009-03-01 00:00:00.000         4800.00
1           吉祥商店       2009-04-01 00:00:00.000         5100.00
1           吉祥商店       2009-05-01 00:00:00.000         5200.00
1           吉祥商店       2009-06-01 00:00:00.000         5300.00
1           吉祥商店       2009-07-01 00:00:00.000         4700.00
1           吉祥商店       2009-08-01 00:00:00.000         4600.00
1           吉祥商店       2009-09-01 00:00:00.000         5200.00
1           吉祥商店       2009-10-01 00:00:00.000         5100.00
1           吉祥商店       2009-11-01 00:00:00.000         5400.00
1           吉祥商店       2009-12-01 00:00:00.000         5100.00
2           如意商店       2009-01-01 00:00:00.000         4800.00
2           如意商店       2009-02-01 00:00:00.000         4700.00
2           如意商店       2009-03-01 00:00:00.000         5200.00
2           如意商店       2009-04-01 00:00:00.000         5100.00
2           如意商店       2009-05-01 00:00:00.000         5200.00
2           如意商店       2009-06-01 00:00:00.000         4300.00
2           如意商店       2009-07-01 00:00:00.000         4900.00
2           如意商店       2009-08-01 00:00:00.000         4800.00
2           如意商店       2009-09-01 00:00:00.000         4600.00
2           如意商店       2009-10-01 00:00:00.000         4900.00
2           如意商店       2009-11-01 00:00:00.000         5000.00
2           如意商店       2009-12-01 00:00:00.000         5100.00

(所影响的行数为 24 行)


客户编号 客户名称   月份一    销售额一   月份二     销售额二    月份三    销售额三                 
-------- ---------- --------  -------- -----------  ---------   --------- -----------
1        吉祥商店   2009-04-01 5100.00  2009-05-01  5200.00    2009-06-01  5300.00
1        吉祥商店   2009-09-01 5200.00  2009-10-01  5100.00    2009-11-01  5400.00
1        吉祥商店   2009-10-01 5100.00  2009-11-01  5400.00    2009-12-01  5100.00
2        如意商店   2009-03-01 5200.00  2009-04-01  5100.00    2009-05-01  5200.00

(所影响的行数为 4 行)

板凳

谢谢二楼朋友,但此语法在VFP里不识别。

3 楼

请看一楼红色部分.
GOMONTH()在我的9.0可以识别.

4 楼

我好像找到原因了,应该是这样的。我发现当把记录索引之后,用GO 命令会出现记录号重复。例如:当我把b1索引后,用它和B2的识别号进行对比时(set filter to sbh=b->sbh) ,再用go  5命令,这时当前表的第5条记录其实是第17条,因为用了索引,所以指针会指向当前的第5条记录,可实际上真正的第5条记录就会受到影响。这时如果2个“第5条”记录同时都大于定额,那么就会出现我上述所描述的情况。我又新建立一个表b4,用来存放set filter to sbh=b->sbh 的记录,这时的记录号都是正确的。执行完一次就将b4清空,再存放下一组记录。运行完整个代码后成功,这个方法很笨。不过通过这个试验我才发现确实是这个原因造成上述情况。

5 楼

三楼朋友,我用的是VFP9,但一楼第一行代码就执行不了,我还没有来得及研究
“SELECT A.KHBH,A.KHMC,B.YF,B.XSE INTO #CUR_TMP FROM DEB A LEFT JOIN XSB B ON A.KHBH=B.KHBH”

6 楼

汗...
表名称什么的你总要改下再执行吧?

7 楼

我当然是改过的。提示语法不正确,我还没来得及再研究,我想如果您运行正常,应该是没问题的,还是我哪里弄错了,我有时间时会再试,你的代码很简洁。

8 楼

我认为5楼的这样写也行吧:insert to tmp SELECT A.KHBH,A.KHMC,B.YF,B.XSE from deb a,xcb b where A.KHBH=B.KHBH

我来回复

您尚未登录,请登录后再回复。点此登录或注册