向日期字段添加一天,直到加入成功

Adding one day to a date field until the join is successful

不确定标题是否描述得很好,但我的问题基本上是我试图在日期和产品 ID 字段之前将一个 table 连接到另一个,以便能够引入当天分配给该产品的价格。一个 table 用于销售历史记录,另一个是我们所有产品的列表,以及当天的更新价格。价格table就是简单的3列; ProdID、日期、价格。每天生成一组新的价格时,我都会将新的日期数据添加到价格的底部 table,因此 ProdID 每天都会重复多次。

我们的销售历史记录 table 不存储产品当天的销售价格,因此我们必须从价格 table 中获取该值以及完整的价格列表对于每一天,这是加入 ProdID 和 Date 的地方。

到目前为止相当简单......

我的问题是 table 仅在工作日生成当天的更新价格,所以一周中有 2 天没有日期和价格能够加入周末的销售,因此价格栏中留有空白。

为了解决这个问题,我希望连接的逻辑引入 'next available price'。例如。如果在周六或周日进行销售,我想提取周一创建的价格。这是否涉及某种声明,在日期上增加一天,直到它可以执行连接?

我都是在 MS Access 中完成的。

价格Table:

+---------+-------+------------+----------+ | ProdID | Price | Date | Weekday | +---------+-------+------------+----------+ | 9999999 | £50 | 07/06/2016 | Thursday | | 9999999 | £50 | 08/06/2016 | Friday | | 9999999 | £45 | 11/06/2016 | Monday | | 9999991 | £100 | 07/06/2016 | Thursday | | 9999991 | £100 | 08/06/2016 | Friday | | 9999991 | £95 | 11/06/2016 | Monday | +---------+-------+------------+----------+

销售的预期结果 table:

+---------+------------+------------+----------+--+ | ProdID | Sell Price | Date | Weekday | | +---------+------------+------------+----------+--+ | 9999999 | £50 | 08/06/2016 | Friday | | | 9999999 | £45 | 09/06/2016 | Saturday | | | 9999999 | £45 | 10/06/2016 | Sunday | | | 9999999 | £45 | 10/06/2016 | Sunday | | | 9999991 | £100 | 08/06/2016 | Friday | | | 9999991 | £100 | 08/06/2016 | Friday | | | 9999991 | £95 | 10/06/2016 | Sunday | | +---------+------------+------------+----------+--+

非常感谢。

我的解决方案不适用于联接,但适用于子 select。

我假设你有一个 SALES_HISTORY table 如下:

SALES_HISTORY
+---------+-------------+----------+
| ProdID  |     Date    | Weekday  |
+---------+-------------+----------+
| 9999999 |  07/06/2016 | Thursday |
| 9999999 |  08/06/2016 | Thursday |
| ...     |  ...        | ...      |
+---------+-------------+----------+

下面的 SQL 语句首先 selects 销售历史的所有列 table 然后 selects 产品在销售日期或日期的价格销售日期之后的第一个可用日期。

SELECT ProdID,
       Date,
       Weekday,
       (SELECT Price
        FROM   PRICE_TABLE P
        WHERE  P.ProdID = S.ProdID
        AND    P.Date = (SELECT MIN(P2.Date)
                         FROM   PRICE_TABLE P2
                         WHERE  P2.ProdId = P.ProdID
                         AND    P2.Date >= S.Date))
FROM   SALES_HISTORY S;

(请注意,SQL 语句是在编辑器中输入的,因此未经测试。)