【问题标题】:SQL Input Date Range to work out Rate per daySQL 输入日期范围以计算每天的费率
【发布时间】:2018-02-13 18:45:01
【问题描述】:

您好,任何人都可以帮助我根据以下两个表格生成每日费率所需的 T-SQL 查询:

我有一个包含范围的表格:

FromDate   | ToDate
2017-06-20   2017-07-01

和一张包含费率的表(此表不限于2条记录):

FromDate     | Rate
2017-06-11     400  
2017-06-24     1200

根据第一个表的范围,我需要生成一个结果集,如下所示,它返回输入范围内每个日期的汇率:

Date        |  Rate
2017-06-20     400
2017-06-21     400
2017-06-22     400
2017-06-23     400
2017-06-24     1200
2017-06-25     1200
2017-06-26     1200
2017-06-27     1200
2017-06-28     1200
2017-06-29     1200
2017-06-30     1200
2017-07-01     1200

然后,我需要在后面的步骤中对费率求和以产生总数。

非常感谢您能提供的任何帮助。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    一个非常简单的方法是递归 CTE 和 apply:

    with cte as (
          select fromdate as dte, todate
          from table1
          union all
          select dateadd(day, 1, fromdate), todate
          from cte
         )
    select dte, t2.rate
    from cte cross apply
         (select top 1 t2.rate
          from table2 t2
          where t2.fromdate <= cte.dte
          order by t2.dte desc
         ) t2;
    

    肯定还有其他方法。默认情况下,这将适用于最长 100 天的范围(您可以使用最大递归选项来获得更多)。

    如果您有更多数据,某种数字表会很有帮助。

    【讨论】:

    • 谢谢你让我走上正轨。我不得不稍微修改查询,但我现在得到了预期的结果。
    【解决方案2】:

    这是我最终用来获得所需结果的 T-SQL。感谢 Gordon 让我走上正轨。

    with cte as (
      select fromdate as dte, todate
      from Table1
      union all
      select dateadd(day, 1, dte), todate
      from cte where dte < todate
     )
    select dte, t2.rate
    from cte cross apply
     (select top 1 t2.rate
      from Table2 t2
      where t2.fromdate <= cte.dte
      order by t2.fromdate desc
     ) t2;
    

    【讨论】:

    • 如果有一些小错误,您应该编辑他的答案,不要发布新答案...
    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多