¡Claro!

Podemos incluirlo en un único proc sql:

proc sql;
    create table salida as     
    select t_entrada.sk_contrato,
           sum(t_entrada.saldo_impagado, -t_saldos.saldo_recuperado) as saldo_impagado
    from entrada as t_entrada
    inner join saldos_recuperados(where=(&fecha_negocio lt fecha_fv and &fecha_negocio ge fecha_iv)) as t_saldos
    on t_entrada.sk_contrato = t_saldos.sk_contrato
    order by sk_contrato desc;
quit;


Básicamente, estamos creando la tabla salida a partir de un left join de la tabla saldos_recuperados (filtrada por los valores de las variables fecha_fv y fecha_iv y la macrovariable fecha_negocio) a la tabla de entrada, y calculando un nuevo saldo_impagado ajustándolo minorando los de la tabla de entrada por los saldo_recuperado.
Si quisieras conservar mas variables de la tabla entrada, deberías añadirlas al select.

También te dejo el código con comentarios, por si lo prefieres:


proc sql;
    create table salida as  /*  Nueva tabla salida       */     
    select t_entrada.sk_contrato,        /*  listamos las variables a conservar de la tabla entrada      */
           sum(t_entrada.saldo_impagado, -t_saldos.saldo_recuperado) as saldo_impagado   /*  calculamos saldo_impagado minorandolo con saldo_recuperado de la tabla entrada      */
    from entrada as t_entrada   /* Indicamos tabla entrada    */     
    inner join saldos_recuperados(where=(&fecha_negocio lt fecha_fv and &fecha_negocio ge fecha_iv)) as t_saldos  /* Indicamos tabla saldos_recuperados, filtrada por los valores de las variables fecha_fv y fecha_iv y la macrovariable fecha_negocio    */  
    on t_entrada.sk_contrato = t_saldos.sk_contrato       /*  realizamos el cruce en función del sk_contrato  */  
    order by sk_contrato desc;  /*  ordenamos la tabla resultante     */     
quit;
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence