2016-07-06 6 views
1

Ich habe folgende Tabellenstruktur. Ich möchte auf jeder Ebene von TAB2 eine Summe erhalten.Hierarchie Abfrage Summe auf jeder Ebene

TAB1 speichert die Hierarchie in den Ebenenspalten. Hier

TAB1 
----- ----- ---- ---- 
KEY L1  L2 L3 
---- ----- ----- ---- 
A  A 
B  A  B 
C  A  B  C 
D  A  B  D 

TAB2 
----- 
KEY TC 
---- ---- 
A  10 
B  11 
C  6 
D  12 
X  11 

Expected Output: 

KEY SUM 
---- ---- 
A 39 
B 29 
C 6 
D 12 
X 11 

ist SQLFiddle-Link: LINK TO FIDDLE

+0

Hier ist ein großartiger Ort zu starten. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

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

+0

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

Antwort

1

Oracle-Setup

Create table TAB1 (pKey varchar2(10),level1 varchar2(10),level2 varchar2(10),level3 varchar2(10),level4 varchar2(10)); 
insert into TAB1(pKey,level1) values('A','A'); 
insert into TAB1(pKey,level1,level2) values('B','A','B'); 
insert into TAB1(pKey,level1,level2,level3) values('C','A','B','C'); 
insert into TAB1(pKey,level1,level2,level3) values('D','A','B','D'); 

Create table TAB2 (pKey varchar(10), tc integer); 
insert into TAB2(pKey,tc) values('A',10); 
insert into TAB2(pKey,tc) values('B',11); 
insert into TAB2(pKey,tc) values('C',6); 
insert into TAB2(pKey,tc) values('D',12); 
insert into TAB2(pKey,tc) values('X',11); 

Abfrage:

SELECT t2.pKey, 
     SUM(COALESCE(t4.TC, t2.tc)) AS tc 
FROM tab2 t2 
     LEFT OUTER JOIN 
     tab1 t1 
     ON (t2.pKey = t1.pKey) 
     LEFT OUTER JOIN 
     tab1 t3 
     ON ( t1.level1 = t3.level1 
      AND (t1.level2 IS NULL OR t1.level2 = t3.level2) 
      AND (t1.level3 IS NULL OR t1.level3 = t3.level3) 
      AND (t1.level4 IS NULL OR t1.level4 = t3.level4)) 
     LEFT OUTER JOIN 
     tab2 t4 
     ON (t3.pKey = t4.pKey) 
GROUP BY t2.pKey; 

Output:

PKEY    TC 
---------- ---------- 
D     12 
A     39 
B     29 
C     6 
X     11 
1

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 
Verwandte Themen