【问题标题】:How to sum() for three months data including current month如何对包括当月在内的三个月数据求和()
【发布时间】:2017-02-21 11:24:57
【问题描述】:

我在 SQL Server 中有一个类似这样的表

ProjectId   BookedHours    FiscalYear  FiscalMonth
--------------------------------------------------
PRJ1        2040            2015-16     1-Apr-15
PRJ1        1816            2015-16     1-May-15
PRJ1        1760            2015-16     1-Jun-15
PRJ1        1832            2015-16     1-Jul-15
PRJ2        1752            2015-16     1-Sep-15
PRJ2        1529            2015-16     1-Oct-15
PRJ2        1336            2015-16     1-Nov-15
PRJ2        1480            2015-16     1-Dec-15
PRJ2        522             2015-16     1-Jan-16

我需要总结当前 + 前两个月预订时间的值,即预期结果应如下表所示

ProjectId   BookedHours    FiscalYear  FiscalMonth  ExpectedValue
-----------------------------------------------------------------
PRJ1        2040            2015-16     1-Apr-15    2040
PRJ1        1816            2015-16     1-May-15    3856
PRJ1        1760            2015-16     1-Jun-15    5616
PRJ1        1832            2015-16     1-Jul-15    5408
PRJ2        1752            2015-16     1-Sep-15    1752
PRJ2        1529            2015-16     1-Oct-15    3281   
PRJ2        1336            2015-16     1-Nov-15    4617
PRJ2        1480            2015-16     1-Dec-15    4345
PRJ2         522            2015-16     1-Jan-16    3338

【问题讨论】:

    标签: sql-server-2008 sum common-table-expression


    【解决方案1】:

    这是一种方法...

    WITH cte AS 
    (
        SELECT 
        row_num = ROW_NUMBER() OVER(ORDER BY FiscalMonth),
        * 
        FROM dbo.Project p
    )
    SELECT CurrentMonth.ProjectID, CurrentMonth.BookedHours, CurrentMonth.FiscalYear, CurrentMonth.FiscalMonth, 
    (CurrentMonth.BookedHours + COALESCE(OneMonthBack.BookedHours, 0) + COALESCE(TwoMonths.BookedHours, 0)) AS ExpectedValue
    FROM cte CurrentMonth
    LEFT JOIN cte OneMonthBack ON OneMonthBack.row_num = CurrentMonth.row_num - 1
    LEFT JOIN cte TwoMonths ON TwoMonths.row_num = CurrentMonth.row_num - 2
    

    希望对你有用。

    【讨论】:

    • 谢谢nscheaffer,它部分工作,你可以从结果表中了解到,对于不同的项目,它又从第一行开始,你能帮我吗..下面的查询给出了部分结果跨度>
    • 我错过了。您只需要添加到每个 LEFT JOIN 标准以将每个表的 ProjectID 设置为相等,但看起来您已经弄清楚了。干得好。
    【解决方案2】:
        WITH cte AS 
    (
        SELECT *,row_num=ROW_NUMBER() OVER( PARTITION BY Projectid ORDER BY Projectid,FiscalYear,FiscalMonth)
        FROM dbo.Project p
    )  
    
    SELECT CM.ProjectID, CM.FiscalYear, CM.FiscalMonth, CM.BookedHours, 
    (CM.BookedHours + COALESCE(OMB.BookedHours, 0) + COALESCE(TM.BookedHours, 0)) AS ExpectedValue
    FROM cte CM
    LEFT OUTER JOIN cte OMB WITH(NOLOCK) ON OMB.row_num = CM.row_num - 1 and CM.Projectid=OMB.Projectid
    LEFT OUTER JOIN cte TM WITH(NOLOCK) ON TM.row_num = CM.row_num - 2 and CM.Projectid=TM.Projectid
    ORDER BY CM.ProjectID, CM.FiscalYear, CM.FiscMonth ASC
    

    上面的查询非常适合我的表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2018-07-10
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多