如何在visual foxpro中使用任何条件根据另一表中另一列的计数更新一列?

问题描述 投票:0回答:1
SET STEP ON
Close Databases
Cd e:\ksv\Data
Use ohd IN 0 shared
Use cus IN 0 shared

SELECT * FROM cus inTO TABLE tempcus
ALTER table tempcus ADD COLUMN totalsold int
UPDATE tempcus SET totalsold=RECCOUNT(ohd.status='5') WHERE tempcus.customer=ohd.customer
SELECT * FROM tempcus INTO CURSOR cur
BROWSE

我已经尝试了上面的代码,我得到一个错误,说无效的表号,有人能帮助我。

visual-foxpro
1个回答
1
投票

RECCOUNT()函数只给你一个workarea#或别名的记录数,例如RECCOUNT("ohd")会给ohd表的总记录数。

你要的是这样的东西。

SELECT COUNT(*) totalsold,cus.customer FROM cus JOIN ohd ON cus.customer=ohd.customer WHERE ohd.cstatus='5' INTO CURSOR cur GROUP BY cus.customer
BROWSE

0
投票

在VFP中,有一个 REPLACE 命令,它允许你基于任何值替换一个或多个字段,即使是来自其他查询的可变结果......或固定值。 例子:除非你应用了一个范围子句(用于条件),否则这个命令可以在当前选择的工作区域的任何表和任何行上工作。

样本仅用于REPLACE命令的上下文

use SomeOtherTable in 0 shared
select SomeOtherTable
replace SomeNumberField with 1.234, SomeStringField with 'Hello', etc...

或带条件(假的,只是为了显示你可以应用到多行。

replace SomeNumberField with SomeNumberField * 3 for StatusField = 'X'

现在,回到你原来的内容。 看来你是想从状态=5的OHD表中得到一个总记录数的结果临时表。 VFP允许你将SQL-Select运行到临时的读写 "游标 "表中,当关闭时将自己删除,但又允许对它们进行修改(如浏览,或其他直接操作,如用REPLACE命令)。

你可以通过对查询结果集的左连接得到你要找的计数。 为了帮助你逐个看清这几块,我将分步做,这样你就可以跟着做,然后最后加入到一个。

首先,你要统计OHD表中每个客户的状态=5的所有记录......下面的SQL查询中,"o "和 "c "是ALIAS的引用

SET STEP ON
Close Databases
Cd e:\ksv\Data
Use ohd IN 0 shared
Use cus IN 0 shared

select ;
      o.customer, ;
      count(*) NumberOfRecords ;
   from ;
      OHD o ;
   where ;
      o.status = '5' ;
   group by ;
      o.customer ;
   into ;
      cursor C_JustCountsPerCustomer READWRITE

上面的 "进入游标 "部分会创建一个可行的表,并给它取名为 "C_JustCountsPerCustomer"。 我一直试图用 "C_"作为表名的前缀,唯一的目的是知道这是一个临时的 "CURSOR "结果,而不是一个真正的最终表,但这只是我历史上应用的命名习惯。

现在,如果你对这个结果进行浏览,你会看到每个客户的ID和多少个状态='5'。 结果表 "游标 "就像其他打开的表一样,你可以根据自己的需要进行索引和浏览等。 但这只能给出had status为'5'的记录。 但你可以有更多的客户,从来没有'5'状态的记录。

现在,把你所有的客户和他们各自的计数放到一个结果表 "cursor "中。 我可以将上面的查询通过LEFT-JOIN在SQL-Select中使用,意思是,给我第一张表(左侧)的所有信息,不管在第二张表(右侧)中是否有匹配的记录。 但如果有匹配的右侧,也给我这些值。

select ;
      c.*, ;
      NVL( C_tmpResult.NumberOfRecords, 0000 ) as NumberOfRecords ;
   from;
      CUS c ;
         LEFT JOIN ;
         (select ;
                o.customer, ;
                count(*) NumberOfRecords ;
             from ;
                OHD o ;
             where ;
                o.status = '5' ;
             group by ;
                o.customer ) C_tmpResult ;
            ON ;
               c.customer = C_tmpResult.customer ;
   into ;
      cursor C_CusWithCounts readwrite 

所以,你可以看到左面的连接使用第一个查询来获取计数,但查询的主要部分从customer表(别名 "c")获取记录,并在共同的customer id列上连接。 NVL() "说明如果C_tmpResult表中有给定客户的值,就抓取该值。 是的,我明确地用0000来强制要求结果的最小宽度为4位数,以防第一个客户没有任何值而使列宽只有1位数。

无论如何,在最后,你会得到你的结果临时表(游标),其中有客户信息和我认为你正在寻找的计数。 你应该可以做一个浏览,然后就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.