• Farooq,

    Can you please verify the below code. Looks better performance.

    DECLARE @tbl TABLE (ID int identity(1,1),dt DATETIME,program VARCHAR(100),Value INT,RunningTotal INT)

    INSERT INTO @tbl(dt,program,Value)

    SELECT '1/1/2012','Actual', 5

    UNION ALL SELECT '1/2/2012','Actual', 5

    UNION ALL SELECT '1/3/2012','Actual', 10

    UNION ALL SELECT '1/4/2012','Actual', 5

    UNION ALL SELECT '1/5/2012','Actual', 5

    UNION ALL SELECT '1/6/2012','Actual', 5

    UNION ALL SELECT '1/7/2012','Actual', 5

    UNION ALL SELECT '1/8/2012','Actual', 5

    UNION ALL SELECT '1/9/2012','Actual', 5

    UNION ALL SELECT '1/10/2012','Forcast', 2

    UNION ALL SELECT '1/11/2012','Forcast', 1

    UNION ALL SELECT '1/12/2012','Planned', 1

    UNION ALL SELECT '1/13/2012','Planned', 1

    UNION ALL SELECT '1/14/2012','Planned', 2

    UNION ALL SELECT '1/15/2012','Planned', 3

    UNION ALL SELECT '1/16/2012','Planned', 4

    UNION ALL SELECT '1/17/2012','Planned', 5

    UNION ALL SELECT '1/18/2012','Planned',6

    DECLARE @RunningTotal INT

    ;WITH CTE AS

    (

    SELECT ID,dt,program,Value,RunningTotal,ROW_NUMBER() OVER(PARTITION BY Program ORDER BY dt) AS RN,

    DENSE_RANK() OVER(ORDER BY Program)RankD

    FROM @tbl

    )

    ,CTE2 AS

    (

    select dt,program,Value,Value AS RunningTotal,RN,RankD,

    MAX(RN) OVER(PARTITION BY RANKD) AS MAXRN

    FROM CTE

    WHERE RN = 1

    UNION ALL

    SELECT cte2.dt,cte2.program,cte.Value,cte2.RunningTotal+cte.value AS RunningTotal,cte2.RN,cte2.RankD,

    MAX(cte2.MAXRN+1) OVER(PARTITION BY cte2.RANKD) AS MAXRN

    FROM CTE INNER JOIN CTE2 ON CTE.RankD = CTE2.RankD AND CTE.RN = CTE2.MAXRN+1

    )

    select dt,Program,Value,RunningTotal from CTE2

    order by Program,dt

    Regards,
    Mitesh OSwal
    +918698619998