В растворе, представленный ниже (в том числе входных данных как факторизованные подзапросы), сначала я показать, как использовать unpivot
и дополнительные операции по нормализации tab1
(результат является факторизованными подзапросами n
для "n
ormalized «). Затем, если бы у вас были данные в нормальной форме, выход мог быть получен прямым непосредственным применением стандартного иерархического запроса, как показано в нижней части моего кода.
with
tab1 (key, L1, L2, L3) as (
select 'A', 'A', null, null from dual union all
select 'B', 'A', 'B' , null from dual union all
select 'C', 'A', 'B' , 'C' from dual union all
select 'D', 'A', 'B' , 'D' from dual
),
tab2 (key, TC) as (
select 'A', 10 from dual union all
select 'B', 11 from dual union all
select 'C', 6 from dual union all
select 'D', 12 from dual union all
select 'X', 11 from dual
),
unpiv (key, l, ancestor) as (
select key, to_number(substr(lv, 2)), ancestor from tab1
unpivot (ancestor for lv in (L1, L2, L3))
),
d (key, depth) as (
select key, max(l)
from unpiv
group by key
),
n (child, parent, TC) as (
select d.key, u.ancestor, tab2.TC
from unpiv u
right outer join d
on u.key = d.key and u.l = d.depth - 1
left outer join tab2
on d.key = tab2.key
)
SELECT key, sum(TC) as sum_TC
from (
select connect_by_root child as key, TC
from n
connect by prior child = parent
)
group by key
order by key;
По пути, в unpiv
, я уже все родитель-потомок, так что я мог присоединиться, что непосредственно tab2
на unpiv.key = tab2.key
и суммируется TC
группировку ancestor
(аналогично решению mt0 в). Вместо этого я хотел продемонстрировать два отдельных шага: (1) нормализация tab1
и (2) насколько просто использовать иерархические запросы для нормализованных таблиц.
Выход:
KEY SUM_TC
--- ----------
A 39
B 29
C 6
D 12
Здесь отличное место, чтобы начать. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
Пожалуйста, укажите желаемый результат для этих данных, так как неясно, что вы имеете в виду * сумму на каждом уровне *. Я думаю о по крайней мере 3 интерпретациях этого. – trincot
Добавление в комментарий trincot - не просто предоставить желаемый результат, объясните на английском языке (нет кода!) КАК этот вывод должен быть получен. – mathguy