2015-09-29 2 views
0

Прямо сейчас у меня есть такой набор данных; (8 записей)
Как подсчитать группу по дереву ORACLE?

cid pid 
108 100 
108 100 
423 400 
423 400 
100 0 
100 0 
100 0 
200 0 

дерево как выглядит следующим образом:

root -- 0 
--child 100 
    --sub child 108 
    ---sub ...(maybe has more level) 
--child 200 
    --sub child 205 
--child 400 
    --sub child 423 

И я хочу, чтобы подсчитать всю сумму записывает каждый по истории ребенка (не к югу ребенка, запись к югу ребенка должен рассчитать в его отец или дедушка до первого уровня дочернего узла).

поэтому результат должен понравиться:

node counts 
100  5 
200  1 
400  2 

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

мой SQL выглядит следующим образом:

select cid as node,count(1) as counts 
from (one subselect for get the 8 records) a 
start with a.pid = '0' 
connect by prior a.cid = a.pid) t group by cid; 

результат пуст .. , кто может мне помочь? или кто знает детали для группы оракулов по ключевым словам, работает при использовании вместе с древовидной структурой?

+0

Какой результат вы получите с настоящим запросом? В группе по статье: «группа помощи», что такое помощь? –

+0

sorry.it должен был cid.and результат был пустым. – alardear

+0

как может '--child 400' является потомком root' 0', когда в вашем наборе данных нет записи '400 0'. – Utsav

ответ

0

Попробуйте это:

SELECT top_cid, Count(1) FROM (
    WITH 
    parent_child as (
     select distinct a.cid, a.pid from a 
     union 
     select a.pid, 0 from a 
     where a.pid<>0 and not exists (
     select 1 from a a1 where a1.cid=a.pid 
    ) 
    ), 
    tree as (
     select level as lvl, 
     --connect_by_root in 10g and above 
     replace(sys_connect_by_path(decode(level, 1, cid), '~'), '~') AS top_cid, 
     pid, cid 
     from parent_child 
     start with pid = 0 
     connect by prior cid = pid(+) 
    ) 
    select tree.top_cid, a.pid, a.cid 
    from a, tree 
    WHERE a.cid=tree.cid 
) GROUP BY top_cid 
+0

Получаю результат: 400-2, 0-6 не за исключением результата – alardear

Смежные вопросы