Por lo pronto, el uso de GROUP BY intermedios peude darte problemas, ya que toda clausula final genera consolidaciones. Por ello debes generar subconsultas con cada SELECT.
Por otro lado, el UNION puede genera errores porque tiene el comportamiento de un DISTINCT: Descarta registros con iguales valores (improbables pero no imposibles)
Yo te sugeriría, antes de avanzar, probar:
Código MySQL:
Ver original prod_nom,
egresos
(SELECT mov_articulos.prod_cod
, mov_articulos.prod_nom,
SUM (mov_articulos.prod_cant
) egresos
ON mov_factura.nro_factura
= mov_articulos.id_comp
prod_nom,
inresos
'' prod_nom,
SUM (mov_prov_articulos.prod_cant
) ingresos
ON mov_prov_factura.nro_factura
= mov_prov_articulos.id_comp
GROUP BY mov_prov_articulos.prod_cod
) T2
;