代码之家  ›  专栏  ›  技术社区  ›  Rippo

有关创建通知计划的SQL结构的帮助

  •  3
  • Rippo  · 技术社区  · 15 年前

    嗨,我有以下问题,我正在努力找出解决问题的最佳方法。

    我有一个表称为[关键绩效指标],数据如下:

    [ContractId]    [KpiId]      [NotificationIntervalInMonths]
     1000           1               3
     1000           2               5
    

    我有一份[合同]表格,其中包括:

    [ContractId]    [StartDate]     [EndDate]
     1000           1/Nov/2009      4/Apr/2011
    

    我正在寻找一种方法来显示关键绩效指标何时应在合同的开始日期和结束日期之间通知用户,例如,上面的结构将创建以下列/行:

    [ContractId]    [KpiId]      [NotificationDate]
       1000            1            1/Feb/2009
       1000            1            1/May/2010
       1000            1            1/Aug/2010
       1000            1            1/Nov/2010
       1000            1            1/Feb/2011 
       1000            2            1/Apr/2010
       1000            2            1/Sep/2010
       1000            2            1/Feb/2011
    

    首先,我认为我将创建一个查找表,每当我插入一个新的关键绩效指标时,它都会被填充,这似乎是可行的,而且可能是最好的方法。

    我的业务逻辑规定不能更改[通知IntervalinMonts],但是合同的[结束日期]可以更改。这意味着我必须根据新合同[结束日期]在查找表中添加/删除记录,对我来说,这有点混乱。

    所以这就引出了我的问题,是否有一种纯SQL方法可以在不创建查找表的情况下为我提供通知时间表?不允许使用光标:P,但我希望CTE可以在这里工作。

    如果我没有提供足够的信息,请询问。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Ryan O'Neill    15 年前

    创建一个表值函数,该函数接受两个日期范围,并返回该范围内每个月的第一个日期。然后在查询中联接到该函数。抱歉,无法提供更多详细信息,有人在Skype上骚扰我(哦,是你!):)

        2
  •  1
  •   Rippo    15 年前

    这是答案,如果有人可以复习/增强它,请告诉我…

    declare @startDate datetime, @endDate datetime
    set @startDate = '01/Nov/2009'
    set @endDate = '04/Apr/2011'
    
    declare @kpi table(kpiid int, interval int)
    insert into @kpi 
    select 1, 3 
    union select 2, 5
    --union select 3, 9 
    --union select 4, 12
    
    ;with mycte(i, d, interval, p, kpiid) as
    (
     select i = 1, d=@startDate, Interval, 0, kpiid from @kpi 
     union all
     select 
      i = i + 1, 
      dateAdd(mm, i, @StartDate), 
      interval,  
      case when (datediff(mm, @StartDate, m.d)) % interval = (interval - 1) then 1 else 0 end,
      m.kpiid
     from 
      mycte m where m.d < @EndDate
    )
    select * from mycte where p = 1 and d <=@EndDate order by kpiid, d