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

时间:2016-07-01 08:42:52

标签: sql date ms-access join conditional

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

我们的销售历史记录表中没有存储当天销售产品的价格,因此我们必须从Price表中提取该值以及每天的完整价格列表,这是加入的地点ProdID和Date进来了。

到目前为止,到目前为止相当直接的进展......

我的问题来自这样一个事实,即当天更新价格的表格仅在工作日生成,所以我留下了一周中的2天没有日期和价格可以加入到周末销售,所以在价格栏中留下了空白。

为了解决这个问题,我希望联接的逻辑带来“下一个可用价格”。例如。如果在周六或周日进行销售,我想提取周一创建的价格。这是否会涉及某种声明,在该日期之前添加一天直到它可以执行加入?

我在MS Access中执行此操作。

价格表:

+---------+-------+------------+----------+ | 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 | +---------+-------+------------+----------+

销售表的预期结果:

+---------+------------+------------+----------+--+ | 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 | | +---------+------------+------------+----------+--+

非常感谢。

1 个答案:

答案 0 :(得分:2)

我的解决方案不适用于连接,但使用子选择。

我假设您有一个SALES_HISTORY表,如下所示:

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

下面的SQL语句首先选择销售历史记录表的所有列,然后在销售日期或销售日期后的第一个可用日期选择产品的价格。

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语句已输入编辑器,因此未经测试。)