向日期字段添加一天,直到加入成功
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 语句是在编辑器中输入的,因此未经测试。)
不确定标题是否描述得很好,但我的问题基本上是我试图在日期和产品 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 语句是在编辑器中输入的,因此未经测试。)