Общая зарплата по иерархическому запросу sql в Oracle - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь найти общую зарплату, используя oracle иерархический запрос SQL, но не получаю желаемого результата.

Я использую Oracle База данных 12 c Enterprise Edition Release 12.1 .0.2.0 - 64 бита.

Ниже приведены примеры входных таблиц и иерархическая структура.

enter image description here

enter image description here

Ниже приведена желаемая выходная таблица.

enter image description here

Ниже приведен код, который я написал, но он не суммируется в все уровни.

SELECT COALESCE(e.Manager_id, e.Employee_id) Employee_id,
       (SELECT Employee_name
          FROM Employee_table
         WHERE Employee_id = COALESCE(Manager_id, Employee_id)) Employee_name,
       SUM(s.Employee_salary)
  FROM Employee_table e
  JOIN Salary_table s
    ON s.Employee_id = e.Employee_id
 WHERE CONNECT_BY_ISLEAF = 1
CONNECT BY PRIOR s.Manager_id = s.Employee_id
 GROUP BY COALESCE(e.Manager_id, e.Employee_id)
 ORDER BY SUM(s.Employee_salary) DESC;

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020
    with Salary_table (Employee_id, Employee_salary) as (
    select 1, 4000 from dual union all
    select 2, 2500 from dual union all
    select 4, 3400 from dual union all
    select 5, 4500 from dual union all
    select 6, 4300 from dual union all
    select 7, 2000 from dual union all
    select 8, 1200 from dual union all
    select 9, 3100 from dual union all
    select 11, 2600 from dual 
    )
    , Employee_table (Employee_id, Employee_name, Manager_id) as (

    select 1, 'John', null from dual union all
    select 2, 'Phil', null from dual union all
    select 3, 'Rayan', 2 from dual union all
    select 4, 'Peter', 2 from dual union all
    select 5, 'Mark', 2 from dual union all
    select 6, 'Steve', 3 from dual union all
    select 7, 'Margret', 3 from dual union all
    select 8, 'Paul', 3 from dual union all
    select 9, 'Joe', null from dual union all
    select 10, 'Bose', 9 from dual union all
    select 11, 'Jane', 9 from dual 
    )
    select mgr_id, mgr_name, sum(employee_salary) from (
      select employee_id, connect_by_root employee_id mgr_id,
             connect_by_root employee_name mgr_name 
      from 
      employee_table e
      start with manager_id is null
      connect by prior employee_id = manager_id 

    ) 
    join salary_table 
    using(employee_id)
    group by mgr_id, mgr_name
    order by 1;

    MGR_ID  MGR_NAM  SUM(EMPLOYEE_SALARY)
----------  -------  --------------------
         1  John                     4000  
         2  Phil                    17900  
         9  Joe                      5700  
0 голосов
/ 18 апреля 2020

Здесь описан подход, использующий стандартный рекурсивный запрос, а не Oracle конкретный c connect by синтаксис:

with cte (employee_id, employee_name, child_id) as (
    select employee_id, employee_name, employee_id from employee where manager_id is null
    union all
    select c.employee_id, c.employee_name, e.employee_id
    from employee e
    inner join cte c on e.manager_id = c.child_id
)
select c.employee_id, c.employee_name, sum(s.employee_salary) total_salary
from cte c
inner join salary s on s.employee_id = c.child_id
group by c.employee_id, c.employee_name
order by c.employee_id

Рекурсивный запрос начинается с сотрудников, у которых нет менеджера, и получает дочерние элементы. запись каждого узла. Затем внешний запрос выводит таблицу окладов и агрегируется по "root employee".

Демонстрация на DB Fiddle :

EMPLOYEE_ID | EMPLOYEE_NAME | TOTAL_SALARY
----------: | :------------ | -----------:
          1 | John          |         4000
          2 | Philip        |        17900
          9 | Joe           |         5700
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...