是否可以使用Oracle来获取每个级别的员工汇总数量?

时间:2012-02-08 23:16:14

标签: oracle hierarchical-data

假设您在Oracle中有一个标准的组织层次结构表。为简单起见,假设您在该Org表中有一列显示直接分配给该组织的员工数量。

create table org (
    org_id NUMBER(5),
    parent_org_id NUMBER(5),
    emp_count NUMBER (5)
);

insert into org values (1, NULL, 200);
insert into org values (2, 1, 50);
insert into org values (3, 1, 100);
insert into org values (4, 2, 100);

是否可以获得如下所示的结果集:

OrgID, Count
1, 450
2, 150
3, 100
4, 100

也就是说,没有450人直接分配给OrgId1,但当你在OrgID1和BELOW中添加所有人时,直接或间接分配了350个人。同样,使用OrgId2,直接分配50个+在其下分配的100个(在组织4中)。

简单的想法吧?这种查询在Oracle中是否可行?

3 个答案:

答案 0 :(得分:3)

这可以通过分层查询以“错误”的方式完成 - 没有start with子句意味着每一行都是一个起点,然后遍历树到每个叶子并按每个起始点对结果进行分组:

select org_id, sum(emp_count) as emp_count
from ( select connect_by_root(org_id) as org_id, emp_count
       from org 
       connect by parent_org_id=(prior org_id) )
group by org_id;

/*
ORG_ID                 EMP_COUNT             
---------------------- ----------------------
1                      450                  
2                      150                  
4                      100                  
3                      100                  
*/

答案 1 :(得分:0)

我没有oracle可以测试这个,但是你可以做如下的事情:

select OrgID
     , count(*) + (select count(*) from org orgSub where org.orgID = orgSub.parentOrgId) total
  from org
group by OrgID

答案 2 :(得分:0)

您可以在分层查询中使用CONNECT_BY_ROOT来获取每行的根组织。在每行上知道根组织后,您可以将其添加到汇总计算中:

create table org (
    org_id NUMBER(5),
    parent_org_id NUMBER(5),
    emp_count NUMBER (5)
);

insert into org values (1, NULL, 200);
insert into org values (2, 1, 50);
insert into org values (3, 1, 100);

select
    root_org_id,
    org_id,
    sum(emp_count)
from (
    select
        CONNECT_BY_ROOT org_id as root_org_id,
        org_id,
        emp_count
    from
        org
    start with
        parent_org_id is null
    connect by
        parent_org_id = prior org_id
)
group by rollup (root_org_id, org_id);

这会产生:

ROOT_ORG_ID,ORG_ID,SUM(EMP_COUNT)
1,1,200
1,2,50
1,3,100
1,,350
,,350

具有null org_id的行将是根组织的汇总。具有null root_org_id和org_id的最后一行是总计。