2012-02-08 5 views
1

Oracleに標準の組織階層テーブルがあるとします。簡単にするために、Orgテーブルに、その組織に直接割り当てられている従業員の数を示す列があるとします。Oracleを使用して、各レベルの従業員のロールアップ数を取得できますか?

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 

であるあなたは下のOrgID1の全員を追加したときに、そこDIRECTLY OrgId1に割り当てられた450人ではないですが、 350人が直接的または間接的に割り当てられています。 OrgId2では、直接割り当てられた50個+その下に割り当てられた100個(Org 4)があります。

簡単なアイデア?この種の問合せはOracleで可能ですか?

+0

これは確かにOracleで可能です。モデレータの[dba.se](http://dba.stackexchange.com/)への移行のために自己フラグを立て、そこにアカウントを作成する準備はできますか?私はこれ以上十分に進歩しており、すぐに答えが出ると思う。 –

+0

ヒント: 'org_idとしてのconnect_by_root(org_id)の選択、orgからのemp_countの接続by parent_org_id =(以前のorg_id)' –

+0

@JackDouglas、完璧です。答えとして追加してください:) – aquinas

答えて

3

この

は、「間違った」方法ラウンド階層問合せを行うことができます
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     
*/ 
+0

華麗な、ありがとう! – whetstone

0

私はこれをテストするには、Oracleのavaliableを持っていませんが、以下のような何かを行うことができます。

select OrgID 
    , count(*) + (select count(*) from org orgSub where org.orgID = orgSub.parentOrgId) total 
    from org 
group by OrgID 
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 

列をヌルORG_IDでルート組織のためのロールアップになります。 null root_org_idとorg_idを持つ最後の行が総計です。

:なし start with句は、すべての行が、その後、各リーフにツリーを走査開始点であることを意味しないと各別にグループまでの結果は、ポイントを開始 -
+0

おそらく私の質問はやや曖昧でした。私が作った更新を見てください。基本的に、私は、ルートだけでなく、各レベルでカウントを見つける必要があります。 – aquinas

関連する問題