访问SQL - 在每个记录中只有开头的日期范围内分配

时间:2014-10-24 18:21:50

标签: sql access-vba ms-access-2010

我正在使用Access 2010

我有两张桌子:

  1. 价格表,我有时间该价格生效。当价格更新时,我会以新价格及其生效时间获得另一条记录。没有密钥,这个表由两个字段(contract,ProductCode)查询。
  2. 订单,我订购了订单日期和价格。
  3. 我想要做的是在价格表中检查订单下达时的价格。我试图从Order PLUS获取一个表格,其中包含来自ContracPrices表的相应ContractedPrice和PriceValidFrom的所有字段。

    示例:Sample solved database(带@carexcer贡献)

    Orders
    OrderNumber Contract    ProductCode OrderDate   PurchasePrice
    Ord1    Cont1   AAA 07/05/2012  19,23
    Ord1    Cont1   BBB 07/05/2012  5,66
    Ord1    Cont1   CCC 07/05/2012  6,64
    
    ContractPrices
    Contract    ProductCode ContractedPrice PriceValidFrom
    Cont1   AAA 21,14   11/02/2010 18:03:01
    Cont1   AAA 21,84   08/10/2010 12:58:55
    Cont1   AAA 22,06   22/06/2011 22:50:42
    Cont1   AAA 1923,7  27/09/2011 14:17:08
    Cont1   AAA 20      03/07/2012 12:40:36
    Cont1   AAA 22,53   01/08/2012 21:37:26
    Cont1   AAA 22,53   07/08/2012 19:33:29
    Cont1   AAA 22,53   03/09/2012 18:26:38
    Cont1   AAA 22,53   04/09/2012 16:20:09
    Cont1   AAA 22,53   05/11/2012 18:53:18
    Cont1   AAA 20      11/04/2013 15:28:49
    Cont1   AAA 19,84   08/09/2013 19:00:10
    
    DesiredResult
    OrderNumber Contract    ProductCode OrderDate   PurchasePrice   ContractedPrice PriceValidFrom
    Ord1    Cont1   AAA 07/05/2012  19,23   19,23   27/09/2011 14:17:08
    

    请注意,我不限于从单个合同订购产品代码。与ProductCode的合同是多对多的。

    我愿意接受VBA。我不知道如何在不离开Access环境的情况下解决这个问题。我是数据库新手。

    我经过了暴力测试,看到我们购买的价格高于合同价格,所以想要测试整个数据库。

    我试图搜索这个,但无法简明地表达问题。

1 个答案:

答案 0 :(得分:0)

我认为此查询可以解决您的问题:

SELECT
    t1.OrderNo, 
    t1.Contract,
    t1.ProductCode,
    MAX(t2.PriceValidityStartDate) as PriceValidityStartDate,
    MAX(t2.ContractPrice) AS PriceAtTime
FROM 
ORDERS t1 
LEFT OUTER JOIN 
ContractPrices t2
ON t1.Contract = t2.Contract AND t1.ProductCode = t2.ProductCode 
WHERE 
    t1.OrderDate > t2.PriceValidityStartDate
GROUP BY 
    t1.OrderNo, 
    t1.Contract,
    t1.ProductCode

您在此处sqlfiddle进行测试。