la query seria esta : 
    
Código SQL:
Ver originalGO
WITH fechas
    AS
    (
        SELECT CAST ('20150601' AS DATE) AS Fecha
        UNION ALL 
        SELECT DATEADD (D, 1, FECHA) AS FECHA
        FROM FECHAS WHERE FECHA < CAST ('20150831' AS DATE)
    )   
    SELECT f.Fecha, 
     LAG((isnull(depositos.suma_dinero,0) - isnull(sales.total_de_montos,0)),1,0) OVER (ORDER BY f.Fecha) AS saldo_inicial,
        ISNULL (depositos.suma_dinero,0) AS compras,
        ISNULL(sales.total_de_montos, 0) AS total_ventas,
        (LAG((isnull(depositos.suma_dinero,0) - isnull(sales.total_de_montos,0)),1,0) OVER (ORDER BY f.Fecha)+(isnull(depositos.suma_dinero,0) - isnull(sales.total_de_montos,0)) ) AS saldo_final
 
FROM fechas f
    LEFT JOIN (
                              SELECT SUM(t.monto) AS total_de_montos, 
                    COUNT(t.monto) AS numero_montos ,
                    CONVERT(DATE,t.fecha_ingreso) AS fecha_ingreso              
                FROM ventas t 
                WHERE (t.fecha_ingreso <=(SELECT DATEADD(ms,-3,DATEADD(dd,DATEDIFF(dd,0,GETDATE()),1))) AND t.fecha_ingreso >= (SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))) AND t.id_usuario = 29
                GROUP BY CONVERT(DATE,t.fecha_ingreso)      
            ) sales
    ON sales.fecha_ingreso = f.Fecha
    LEFT JOIN (
                SELECT COUNT (dh.monto) AS dinero_depositado, 
                        SUM (dh.monto) AS suma_dinero,
                        dh.fecha_deposito
                FROM usuario u 
                INNER JOIN depositos_historicos dh
                ON u.usuario_id = dh.id_usuario
                WHERE u.usuario_id = 29 AND dh.id_estatus = 3
                GROUP BY dh.fecha_deposito
            ) depositos
    ON depositos.fecha_deposito = f.Fecha
    
ORDER BY f.Fecha ASC
OPTION(maxrecursion 0)
 
GO