【问题标题】:Foxpro Select Most Recent Order for Each CustomerFoxpro 为每个客户选择最近的订单
【发布时间】:2017-08-12 04:55:13
【问题描述】:

在 foxpro 表中,我有 4 个字段:ordernum、orderdate、ordertotal、custpk。

从每个 custpk 的最新订单中返回所有这些字段的 foxpro 选择语句是什么?

【问题讨论】:

  • 在给你答案之前,首先要问的问题是:ordernum & orderdate 的字段类型是什么。 OrderNum 是数字还是字符类型? OrderDate 是 Date、DateTime 还是 Character 类型? SQL 查询语法可能会因您的答案而异。
  • 订单日期为日期字段,ordernum为整数,ordertotal为N 9,2,Custpk为整数。为清楚起见,这是一个 foxpro 表,我需要一个 foxpro 命令,而不是 SQL 数据库。

标签: visual-foxpro


【解决方案1】:

你的表结构和你想要的不是很清楚。您如何定义给定客户的“最新订单”?假设 orderNum 是该表中的主键,并且您通过每个客户具有最高 orderNum 的行来决定给定客户的“最近订单”。然后很容易,一个 VFP 选择命令就足够了(实际上有许多 SQL 选择变体可以返回您需要的结果。下面是最有效的一种):

select * from myTable ;
  where orderNum in ;
  (select max(orderNum) from myTable group by custPK)

顺便说一句,VFP 的 SQL 接近 ANSI-SQL 92。

【讨论】:

    【解决方案2】:

    我需要一个 foxpro 命令,而不是 SQL 数据库

    首先让我们说您不会使用单个 Foxpro 命令行获得您想要的东西。

    相反,在 Foxpro 中获取此信息的最便捷方式是使用 Foxpro 的 SQL Query 命令在 FP/VFP 数据表上运行,并将结果数据放入数据表/游标中。

    SELECT CustPk, OrderNum, OrderDate, OrderTotal FROM MyDataTable ORDER BY CustPk, OrderDate Desc INTO CURSOR OrderedData READWRITE
    * --- Now ordered data is in memory cursor, use it however you need ---
    * --- Each Customer's Most Recent Order will be first record ---
    SELECT OrderedData
    * --- You might just want to BROWSE the results to understand how the data appears ---
    * --- Or you can do anything else with the data ---
    < do whatever >  
    

    有一些方法可以只获取每位客户的最新订单,但请从这里开始,看看是否能满足您的需求。

    顺便说一句:您可能想花一些时间查看免费的在线 VFP 教程视频,网址为: Free Visual Foxpro Videos

    祝你好运

    【讨论】:

    • 谢谢,这是我过去所做的,然后删除所有不需要的记录。我不知道 foxpro 的 sql 查询,我应该一直使用它。我想知道如何只使用 sql 查询命令。
    • 大部分 VFP 的 SQL Query 语法与其他数据库 SQL Query 语法相同。不可否认,FP/VFP 存在一些差异,但请尝试您所知道的,看看它是否有效——它很可能会有效。然后,如果没有,只需将查询语法的哪些部分不起作用,并将该部分替换为 FP/VFP 命令语法。
    【解决方案3】:

    我想知道如何只使用 sql 查询命令来完成它

    好吧,我只使用了一个 SQL 查询命令,但您必须跟进一些其他代码。

    编辑:糟糕:我忘了 Custpk 是整数。
    我正在修改 SQL 查询语法以考虑到这一点。

    虽然它仍然不是 ONE LINE 方法,但另一种方法可能是:

    * --- Get reference records of only customer's last order date ---
    SELECT STR(CustPk) AS cCustPk, MAX(OrderDate) AS LstOrdrDt FROM MyDataTable GROUP BY CustPk INTO CURSOR LstOrds READWRITE
    * --- Now use that to get the complete last order for each customer ---
    SELECT * FROM MyDataTable WHERE (STR(CustPk) + DTOS(OrderDate)) IN (SELECT cCustPk  + DTOS(LstOrdrDt) AS KeyExp FROM LstOrds) INTO CURSOR OnlyLstOrds READWRITE
    * --- Now you have ONLY the last orders ---
    SELECT OnlyLstOrds
    < do whatever >  
    

    请注意,上面的代码是现成的,未经测试,因此可能存在拼写错误,您可以修复。

    另请注意,该站点上的免费在线 VFP 教程视频之一名为:FoxPro 和 SQL 语言

    祝你好运

    【讨论】:

    • VFP 支持子查询和派生查询。您可以简单地使用派生表来编写:select * from myTable t1 inner join (select custPK, max(OrderDate) as maxDate from myTable group by custPK) t2 on t1.custPK = t2.custPK and t1.OrderDate = t2.OrderDate (但这并不意味着退回最近的订单,除非在给定日期,给定客户只有一个订单)。
    猜你喜欢
    • 1970-01-01
    • 2011-05-02
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2021-02-23
    • 1970-01-01
    • 2020-11-27
    相关资源
    最近更新 更多