假设您在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中是否可行?
答案 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的最后一行是总计。