sql - 如何根据可能更改的日期范围在表格中选择值
问题描述
我似乎找不到一个专门解决我在这里尝试做的要求的问题,但如果不是这种情况,我深表歉意。
我有一个示例表:
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
上述标准在哪里加入列?
解决方案
您可以在左连接上使用 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
推荐阅读
- firebase - Deep Link 不打开应用程序,而是进行谷歌搜索
- javascript - JS:我可以在不使用 throw 的情况下从嵌套函数中提前返回吗
- amazon-web-services - 有没有办法让 AWS Aurora 在其 VPC 之外访问?
- python - Dask 分布式内存和结果的持续酸洗/解酸
- ruby-on-rails - Docker:合并文件夹自动删除
- javascript - React Native中未定义的导入函数?
- python - 无法在 google colab notebook 中使用来自 googlesearch 模块的搜索方法
- python - 调用 GMAIL API 时出现间歇性错误 - “调用者没有权限”
- azure - 如何使用 Enterprise Github 设置 Azure Function 持续部署?
- php - 包含 PHP 文件表单子文件夹