首页 > 解决方案 > 如何根据可能更改的日期范围在表格中选择值

问题描述

我似乎找不到一个专门解决我在这里尝试做的要求的问题,但如果不是这种情况,我深表歉意。

我有一个示例表:

    type|start_date|end_date  |cost|

    bananas|2019-01-01|2019-01-31|100
    bananas|2019-02-01|2019-02-28|95
    juice  |null      |null      |55

等等。表格的要点是“食物”或其他任何东西,可以根据不同的时间范围有不同的价格,但是有些物品(例如果汁)不会在日期变化时受到影响(即它们保持不变)。

在另一个表中,我想根据上表中的日期范围查找一个值。

例如:

customerId|transaction_date|item   |quantity|

abc123    |2019-01-25      |bananas|4
abc126    |2019-02-06      |bananas|4
abc128    |2019-02-09      |juice  |1

所以前两个顾客买了香蕉,但是一个在 1 月,一个在 2 月。然后另一位顾客买了果汁。如何根据我的其他表返回正确的相应成本。

我试图在日期是BETWEEN两个的地方做,但这会疏远定价表中不存在的任何其他日期。我也试过用它CASE来解决这个问题,但无济于事。

最好的方法是什么?

我希望结果会产生一个包含以下内容的连接表:

customerId|transaction_date|item   |quantity|cost|

abc123    |2019-01-25      |bananas|4       |100
abc126    |2019-02-06      |bananas|4       |95
abc128    |2019-02-09      |juice  |1       |55

cost上述标准在哪里加入列?

标签: sqlsql-server

解决方案


您可以在左连接上使用 ISNULL。

SELECT P.*, C.cost
FROM Purchases P 
LEFT JOIN Product_Costs C ON P.item = C.type 
      AND P.transaction_date >= ISNULL(C.start_date, P.transaction_date) 
      AND P.transaction_date <= ISNULL(C.end_date, P.transaction_date);

修改尼克的小提琴:http ://sqlfiddle.com/#!18/e366b/6


推荐阅读