Try this - short and sweet
;with mycte as (
select T1.Datecol, ISNULL(T2.Value,0) Val, ROW_NUMBER() OVER(order by T1.datecol) RN
from Dimdate T1 left join TotalsData T2 ON T1.DateCol=T2.DateCol
)
select Datecol,(select top 1 Val FROM mycte T where T.RN<mycte.RN and val<>0 order by RN DESC) val
from mycte
where val=0
UNION
SELECT Datecol,Val FROM mycte where val>0