我正在尝试根据用户提供的日期范围为一些历史数据创建报告。该报告将根据用户提供的日期范围显示所有合同的每月更改。
涉及2个表。第一个是ContractDetails表,每个合同都有1行,其中包含所有必需的基本信息。
ContractID | LicenseID | StartDate | EndDate ---------- | --------- | ---------- | ---------- 304 | ID-567 | 01/01/2018 | 12/31/2018 331 | ID-133 | 01/01/2015 | 12/31/2017 1011 | ID-257 | 06/06/2018 | 12/31/2018 1359 | ID-687 | 01/01/2018 | 12/31/2020
第二个表是ContractChanges。这基本上只是保留了带有FK的ContractID的合同变更的跨国历史记录
ID | FK_ContractID | LicenseID | ChangeDate ---- | ------------- | --------- | ---------- 101 | 304 | ID-123 | 12/28/2018 102 | 331 | ID-615 | 05/25/2018 103 | 331 | ID-994 | 10/31/2018 104 | 1011 | ID-498 | 04/04/2019 105 | 1011 | ID-701 | 04/04/2019
假设用户提供的日期为2018年11月1日至2019年6月30日。预期的输出将是这样的:
ContractID | LicenseID | Month | Year ---------- | --------- | ----- | ---- 304 | ID-567 | Nov | 2018 304 | ID-123 | Dec | 2018 331 | ID-994 | Nov | 2018 1011 | ID-257 | Nov | 2018 1011 | ID-701 | Apr | 2019 1359 | ID-687 | Nov | 2018
如果在提供的日期范围内未发生任何更改,请在第一个月显示原始合同信息(在这种情况下为十一月)。 接下来,如果发生更改,则显示该月内发生的更改。 最后,如果同一个月内发生了多次更改,请使用该合同的最新更改。
这似乎是一个很简单的问题,但是让我失望的是,当月内发生多个更改时的最后一个要求。
任何帮助将不胜感激 谢谢
答案 0 :(得分:0)
根据要求记录逻辑。 此答案不完整,因为它缺少日期过滤功能。
您可以优化此查询以添加所需的确切逻辑,但这应该是一个很好的起点:
select
ContractID, LicenseID, m as [Month], y as [Year]
from (
select
*,
row_number() over(partition by ContractID, y, m order by dt DESC) as rn
from (
select
ContractID, LicenseID, StartDate as dt,
month(StartDate) as m, year(StartDate) as y
from ContractDetails
union all
select
FK_ContractID, LicenseID, ChangeDate,
month(ChangeDate), year(ChangeDate)
from ContractChanges
) x
) y
where rn = 1 -- this predicate keeps only the last row in each month
order by ContractID, y, m