Я бы предложил вам использовать два CTE для расчета прибыли и скидок, а затем сделать FULL OUTER JOIN
для двух наборов. Это гарантирует, что вы получите правильные значения, такие как 0 для отсутствующих прибылей или скидок для employee_id. Если вы хотите игнорировать их, просто измените его на обычный INNER JOIN
CREATE OR REPLACE VIEW V_salary AS --give proper name to indicate it's a view
WITH ge
AS (SELECT e.employee_id,
SUM(g.value) AS gain_value
FROM gain_employee e
JOIN gains g --use left join if some employees don't
--have an entry in gains
ON e.gain_id = g.gain_id
GROUP BY e.employee_id),
de
AS (SELECT e.employee_id,
SUM(d.value) AS dis_value
FROM discount_employee e
JOIN discounts d --use left join if some employees don't
--have an entry in discount
ON e.discount_id = d.discount_id
GROUP BY e.employee_id)
SELECT COALESCE(ge.employee_id, gd.employee_id), --gets you atleast one of
--them when one may be missing.
COALESCE(ge.gain_value, 0) - COALESCE(de.dis_value, 0) AS salary
FROM ge
FULL OUTER JOIN de -- to consider case where one of them is absent
ON ge.employee_id = de.employee_id;