0

我很难在 foxpro 2.6 中进行查询(别无选择)

请注意,由于某种原因,联合查询不起作用。

stockw (item, qte, dat) item is key
shist (item, qte, date) each row is a purchase for item and qte and date

下面的查询将计算 shist 中某件商品的第一次购买,以了解自年初以来我们已经销售了多少个月的每件商品

select shist.item as s_item, MIN(shist.date),stockw.qte as qte_remain,;
 IIF( YEAR(MIN(shist.date)) < 2013, MONTH(DATE()), MONTH(DATE())-MONTH(shist.date)+1 ) as months;
 FROM shist,stockw;
 WHERE (shist.item LIKE 'LF-TK%' OR shist.item LIKE 'PL%' OR shist.item LIKE 'LF-A%') AND stockw.item = shist.item;
 GROUP BY shist.item;
 into CURSOR x

我想: - 计算从 2013 年初到现在每个项目 SUM(shist.qte)/月的平均 qte(月数是根据每个项目的上述查询计算的)

也许在不同的查询中,我想要以下内容: - 从 2013 年初到现在,为每个项目(获取最高月份)选择每个月的 shist.qte 总和的最大值。

4

1 回答 1

1

由于我不太了解您将应用联合的位置,并且您似乎有多次运行查询,所以这是一个非常古老的技巧,在 VFP 的旧时代可用......

当您对游标进行选择时,游标通常是只读的而不是读写追加到...但是,如果您使用第一次运行查询的结果再次作为不同的别名,您可以追加到它. 类似于...的东西

use in select( "C_ThisIsMaster" )

for i = 1 to 10
   use in select( "C_ThisRun" )
   select blah, blah2, blah3 ;
      from YourTables;
      where SomeKey = SomeIDForCyclei;
      into cursor C_ThisRun

   if not used( "C_ThisIsMaster" )
      select 0
      use ( dbf( "C_ThisRun") ) again alias C_ThisIsMaster 
   else 
      select C_ThisIsMaster
      append from dbf( "C_ThisRun" )
   endif 
endfor 

for[i] 循环只是一个示例,但是如果您正在运行许多循环来执行 UNION,您可以将其拉入查询并模拟相同的查询,例如通过

select * 
   from SomeTable 
   where SomeCondition 
   into cursor C_DoTheseItems

use in select( "C_ThisIsMaster" )

select C_DoTheseItems
do while not eof()
   Do the same thing as inside the FOR loop above 

   select C_DoTheseItems
   skip 
enddo

我知道 VFP 有 scan/endscan,但不记得它起源于多远,所以在这里使用了 do while NOT eof() ......

在任一选项结束时,您都可以将尝试处理的每个项目的模拟 UNION 转换为一个“别名”结果“C_ThisIsMaster”以供使用

于 2013-09-07T01:45:59.007 回答