In der Lösung unten bereitgestellt (einschließlich der Eingangsdaten als faktorisierte Unterabfragen), erste zeige ich, wie unpivot
und zusätzliche Operationen verwenden tab1
zu normalisieren (das Ergebnis der faktorisierten Unterabfrage n
für „n
ormalized“ ist). Wenn Sie dann die Daten in normaler Form hätten, könnte die Ausgabe durch eine direkte Anwendung der standardmäßigen hierarchischen Abfrage erhalten werden, wie unten in meinem Code gezeigt.
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;
Auf dem Weg in unpiv
, hatte ich schon alle Eltern-Kind-Beziehungen, so dass ich das direkt mit tab2
auf unpiv.key = tab2.key
und summierten TC
Gruppierung von ancestor
(ähnlich MT0-Lösung) verbunden sein können. Stattdessen wollte ich zwei separate Schritte demonstrieren: (1) Normalisierung tab1
und (2) wie einfach es ist, hierarchische Abfragen auf normalisierten Tabellen zu verwenden.
Ausgang:
KEY SUM_TC
--- ----------
A 39
B 29
C 6
D 12
Hier ist ein großartiger Ort zu starten. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
Bitte geben Sie die gewünschte Ausgabe für diese Daten, wie es nicht klar ist, was Du meinst mit * Summe auf jeder Ebene *. Ich denke an mindestens 3 Interpretationen davon. – trincot
Hinzufügen zu trincot's Kommentar - geben Sie nicht einfach die gewünschte Ausgabe an, erklären Sie in Englisch (kein Code!) WIE diese Ausgabe abgeleitet werden soll. – mathguy