2017-02-21 21 views
0

を含むために私はすなわち+現在、前の2ヶ月間予約時間の値を合計する必要があり、この合計する方法()3ヶ月のデータは現在の月

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 

ようになり、SQL Serverのテーブルを持っています期待される結果は以下の表のようになります

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

これは、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 

ホープ番目ですあなたのために働いています。

+0

おかげでnscheaffer、それはuはあなたが私を助けてくださいすることができ、別のプロジェクトのためにそれを再度行番号1から開始したことを結果テーブルから理解することができ、部分的に働きました。 。 以下のクエリは部分的な結果を返します –

+1

私はそれを逃しました。それぞれのテーブルからProjectIDを等しく設定するためにLEFT JOINの各基準に追加するだけで済みますが、すでにそれを把握しているようです。よくやった。 – 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 

上記のクエリは、私のテーブルのために完璧に動作

関連する問題