Получение производного атрибута через две разные таблицы - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужно получать зарплату сотрудника через две разные таблицы: его доходы и скидки.Отношение сотрудника таблицы к двум таблицам является отношением многих ко многим.Поэтому мне нужно взять employee_id, получить все gain_id в таблице employee_gains, добавить их все и вычесть с аналогичным результатом в скидках.

Я пытался создать представление о зарплате:

  CREATE VIEW salary as 
select ((select sum(value) from gains 
where gain_id in (select gain_id from gain_employee where employee_id=2)) 
- 
(select sum(value) from discount 
where discount_id in (select gain_id from discount_employee where employee_id=2)));

Однако это только (и успешно) дает мне зарплату сотруднику с идентификатором 2. Но как я могу сделать этообщий?Я хочу посмотреть зарплату для всех сотрудников.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Я бы предложил вам использовать два 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;
0 голосов
/ 16 ноября 2018

Это должно сделать это -

CREATE VIEW salary as
select S1.employee_id, (S1.gains - S2.discounts) as salary
    from (select ge.employee_id, sum(g.value) as gains 
              from gain_employee ge, gains g
              where ge.gain_id = g.gain_id
              group by ge.employee_id) S1,
         (select de.employee_id, sum(d.value) as discounts 
              from discount_employee de, discounts d
              where de.doscount_id = d.discount_id
              group by de.employee_id) S2
    where S1.employee_id = S2.employee_id;

Затем вы можете запросить это представление с employee_id в качестве условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...