• How about this one?

    with cte as

    (

    select *, Row_Number() OVER(PARTITION BY ID ORDER BY ID) as RowNum

    from #TempStk

    )

    select a.rownum, a.id, a.status, a.date, a.quantity,

    CASE WHEN a.Status <> 'Receipt' THEN SUM(case when b.Status = 'Receipt' Then b.quantity Else -b.quantity END) - a.quantity

    ELSE ISNULL(SUM(case when b.Status = 'Receipt' Then b.quantity Else -b.quantity END),0) + a.quantity

    END as Bal

    from cte a

    LEFT outer join cte b

    on a.id = b.id and a.RowNum > B.RowNum

    group by a.rownum, a.id, a.status, a.date, a.quantity

    order by a.id, a.rownum