2017-02-21 37 views
0

У меня есть таблица в 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 

ответ

0

Это один подход ...

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 

Надежда й на твоих работах.

+0

Благодаря nscheaffer, он работал частично, и можно понять из таблицы результатов, что для другого проекта он имеет начиная с строки номер один раз, вы можете помочь мне, пожалуйста. . ниже запрос дает частичный результат –

+1

Я пропустил это. Вам просто нужно добавить к каждому из критериев LEFT JOIN, чтобы установить одинаковые идентификаторы ProjectID из каждой таблицы, но похоже, что вы уже поняли это. Хорошая работа. – nscheaffer

0
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 

Над Query отлично работает для моего стола