sql-server - 如何确定 id 日期属于某个范围(范围存储在另一个表的单独行中)
问题描述
我有 SalesFacts 表,其中包含 Sales_Amount、Customer_ID 和 Invoice_Date。在另一个表中,我有关于一些客户的特殊协议的信息(列是:Customer_ID、Agreement_Start_Date、Agreement_End_Date)。
现在 - 我想检查一下 SalesFact 表中的销售是否发生在客户的特殊协议有效时。如果特别协议有效时只有一个日期范围,这将非常容易。但是,在我的情况下,具有特殊协议日期范围的表包含重复的客户 ID,因为对于一个客户,可能有多个时间范围,其中特殊协议处于活动状态。
EG 在 SalesFact 表中,我有一个客户的 3 笔交易:
在 SpacialAgreements 表中,我可以看到,当该客户有权获得特殊协议时,有 2 个数据范围。
我想创建一个查询,将附加列添加到我的 SalesFacts 表中,这将确定交易是否在有特殊协议活动时发生。所以在上面显示的情况下,它将是:
如果只有一个有特殊协议的日期范围,那就很容易了:
Select
S.[Sales_Amount], S.[Customer_ID], S.[Invoice_Date],
IIF(S.[Invoice_Date] >= A.[Agreement_Start_Date] and S.[Invoice_Date]<=A.[Agreement_End_Date],'YES','NO') as AGREEMENT
From SalesFacts S left join SpacialAgreements A on S.[Customer_ID] = A.[Customer_ID]
但由于 SpacialAgreement 表中有多个日期范围,我不知道如何正确实现这一点,而不会冒险在 Sales_Amount 中出现任何重复并且不会丢失任何数据。
有任何想法吗?
解决方案
如果您想完全按照问题所示获取数据,那么对于 SELECT 语句,您可以使用如下内容:
SELECT
S.[Sales_Amount],
S.[Customer_ID],
S.[Invoice_Date],
CASE WHEN EXISTS (SELECT 1
FROM SpacialAgreements A
WHERE A.Customer_ID = S.Customer_ID
AND S.[Invoice_Date] >= A.[Agreement_Start_Date]
AND S.[Invoice_Date] <= A.[Agreement_End_Date])
THEN 'YES'
ELSE 'NO'
END as Agreement
FROM SalesFacts S
因此,如果您从该查询中选择数据或创建视图,则可以使用此解决方案。
如果您想在 SalesFacts 表中将值保留为一个物理列,那么您可以尝试使用触发器解决您的问题。
推荐阅读
- vue.js - 计算属性的返回值在模板中使用时不会改变(没有组合 API 的 Vue3)
- matlab - 如何将unnest单元阵列更改为排队的阵型?
- javascript - 表格没有在 jQuery 中动态附加
- azure - Azure 内部负载均衡器能否拥有属于 VNET 中不同子网的后端?
- sql - 执行 INSERT INTO 与使用 MERGE INTO 之间的区别
- mysql - MySQL慢查询连接两个表,每个表都有全文条件
- python - Python字节增量
- prolog - Prolog 停留在一个复杂的谓词上
- r - 安装 R 包“验证”退出并出现错误
- python - 在线程中销毁 Tkinter 窗口