数据库定价表聚合问题

时间:2016-04-05 13:30:34

标签: database ms-access

我使用MS访问我的工作,并且有一个问题花了我太长时间来解决自己,所以我决定问你们,伙计们。问题是下一个: 我有两张定价表:a_prices

article5    a_price from_date   to_date
00009       952.00  01/01/2012  31/12/2013
00009       720.00  01/01/2014  31/12/2015
00009       750.00  01/01/2016  31/12/2199

和a_client_prices

client_id   article5    a_price from_date   to_date
1           00009       700     31/12/2014  11/09/2015
2           00009       800     05/10/2015  07/04/2016

问题是创建一个返回精确客户端价格表的查询,因此如果该查询的输入为"其中client_id = 1"结果表看起来像下一个:

article5    a_price from_date   to_date
00009       952.00  01/01/2012  31/12/2013
00009       720.00  01/01/2014  30/12/2014
00009       700     31/12/2014  11/09/2015
00009       720.00  12/09/2014  31/12/2015
00009       750.00  01/01/2016  31/12/2199

如果client_id = 2,那么:

article5    a_price from_date   to_date
00009       952.00  01/01/2012  31/12/2013
00009       720.00  01/01/2014  04/10/2015
00009       800     05/10/2015  07/04/2016
00009       750.00  08/04/2016  31/12/2199

所以在查询中应该有类似重叠排除机制的东西,其中a_client_prices具有更高的优先级,但我无法想象更好的事情然后连接每天包含记录的表,排除过多的记录然后聚合它回到时期。

考虑到我使用ms访问,所以我可以轻松使用自定义聚合功能,如果你可以建议一个。我觉得它可能是解决方案之一,但在该领域的经验不足以了解如何自己设计一个。如果我错过了之前发布的答案,请提前感谢您的帮助。随意判断初始数据组织并提出其他可能性。

P.S。日常聚合的解决方案非常有效,但是处理时间太长而且查询使用方式太多,所以这个解决方案被拒绝了。

1 个答案:

答案 0 :(得分:1)

查询无法做到这一点。

您正在使用此源记录:

00009       720.00  01/01/2014  31/12/2015

并将其拆分为两个记录,即时更改日期字段:

00009       720.00  01/01/2014  30/12/2014
00009       720.00  12/09/2014  31/12/2015

这只是几种不同情况中的一种。

没有聚合功能会这样做。您需要一个VBA解决方案,遍历记录集,并在新表中创建目标记录。

修改

我计算一个客户价格表的方法是:

  • 从临时表中删除*
  • 将*从a_prices插入临时表
  • {li>为a_client_prices中的每条记录:
    • 如果它“适合”一个日期范围:复制,适应 - &到日期
    • 如果它与两个日期范围重叠:调整两个记录以排除新的日期范围
    • a_client_prices记录插入临时表

它需要相当多的逻辑,但应该非常快。