Intenta con algo como esto:
Código:
SELECT p.des_prod AS Producto,
ISNULL(ap.cant_produccion, 0) -
ISNULL(sal.cant_sal, 0) +
ISNULL(ccd.cant_ccd, 0) -
ISNULL(ods.cant_prod_od, 0) AS Existencia
FROM g_productos AS p
LEFT JOIN (
SELECT cod_prod, SUM(cant_prod_od) AS cant_prod_od
FROM a_ods_prod
GROUP BY cod_prod
) AS ods
ON ods.cod_prod = p.cod_prod
LEFT JOIN (
SELECT cod_prod, SUM(cant_ccd) AS cant_ccd
FROM a_ccd_prod
GROUP BY cod_prod
) AS ccd
ON ccd.cod_prod = p.cod_prod
LEFT JOIN (
SELECT cod_prod, SUM(cant_produccion) AS cant_produccion
FROM a_produccion
GROUP BY cod_prod
) AS ap
ON ap.cod_prod = p.cod_prod
LEFT JOIN (
SELECT cod_prod, SUM(cant_sal) AS cant_sal
FROM a_sal_prod
GROUP BY cod_prod
) AS sal
ON sal.cod_prod = p.cod_prod
WHERE p.cod_prod = 5
GROUP BY p.des_prod, p.cod_prod
Basicamente obtienes los totales por producto para cada tabla antes de hacer la operación que te interesa. Pero la forma en que tienes la consulta me parece correcta. La única explicación que se me ocurre para el comportamiento que tiene es que en la tabla tengas registros duplicados en alguna de ellas.