按用户提供的日期范围限制数据

时间:2019-06-24 17:23:23

标签: sql sql-server sql-server-2012

我正在尝试根据用户提供的日期范围为一些历史数据创建报告。该报告将根据用户提供的日期范围显示所有合同的每月更改。

涉及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

如果在提供的日期范围内未发生任何更改,请在第一个月显示原始合同信息(在这种情况下为十一月)。 接下来,如果发生更改,则显示该月内发生的更改。 最后,如果同一个月内发生了多次更改,请使用该合同的最新更改。

这似乎是一个很简单的问题,但是让我失望的是,当月内发生多个更改时的最后一个要求。

任何帮助将不胜感激 谢谢

1 个答案:

答案 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
相关问题