首页 > 解决方案 > 如何确定 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 中出现任何重复并且不会丢失任何数据。

有任何想法吗?

标签: sql-servertsql

解决方案


如果您想完全按照问题所示获取数据,那么对于 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 表中将值保留为一个物理列,那么您可以尝试使用触发器解决您的问题。


推荐阅读