Sigo sin entender que tipo de movimientos cargas en cada tabla, sin eso, no puede dilucidar de donde saco los datos.
Y deberías tal vez aclarar un poco que quieres obtener.
SQL es explicar en un lenguaje racional y relacional que es lo que se quiere, y de donde se saca. Lo que no me queda claro.
Igual, simplifique la sentencia con
SELECT
m.nro_movimiento,;
NVL( F.nro_serie, 0 ),;
NVL( F.importe, 0 ),;
NVL( s.referencia, 0 ),;
NVL( ds.descri_servicio, '' ),;
NVL( s.importe , 0 ),;
NVL( r.nro_recibo, 0 ),;
NVL( r.nro_cabecera, 0 ),;
NVL( dr.clie_nom, '' ),;
NVL( r.importe, 0 );
FROM caja_movimiento m;
INNER JOIN caja_mov_factura F;
ON (F.caja_movimiento_nro_movimiento = m.nro_movimiento);
LEFT OUTER JOIN caja_mov_servicios s;
ON (s.nro_movimiento = m.nro_movimiento);
LEFT OUTER JOIN caja_tipos_servicios ds;
ON (s.cod_tipo_servicio = ds.cod_tipo_servicio);
LEFT OUTER JOIN caja_mov_recibos r;
ON (r.nro_movimiento = m.nro_movimiento );
LEFT OUTER JOIN cta_recibos_cab cr;
ON (cr.nro_cabecera = r.nro_cabecera);
LEFT OUTER JOIN cliente dr;
ON (dr.clie_cod = cr.cliente_clie_cod)
WHERE;
m.nro_movimiento = 3
replace el case when (que es de vfp 9) por nvl, el efecto es igual a lo que tu resolvias pero es mucho mas compacto.
En todos los casos que relacionabas con las tablas auxiliares, vi que filtrabas por m.nro_movimiento = 3, de la tabla principal, por lo que lo pase al where.
Esto último no se soluciona algo, ya que cuando se ponde una condición multiple en el ON del JOIN generalmente filtra sobre la tabla que se asocia y no sobre la principal.