2016-12-05 5 views
3

Ich habe einige Probleme mit der Summierung einiger Spalte in meiner Abfrage mit Aggregation. Es ist ein bisschen schwierig zu beschreiben, was passiert, aber ich werde mein Bestes versuchen:
Ich habe 3 Tabellen - Details, zusätzliche Details und Orte. Orte ist ein Tisch, der Orte in der Welt enthält. Details enthält Details zu Ereignissen, die aufgetreten sind, und zusätzliche Details enthalten weitere Daten zu den Ereignissen.
Jeder Ort hat eine ID und eine ParentID (wie New York hat eine ID und es ist Eltern ID ist die US. So etwas wie das). Die ID des Ereignisses (Details) erscheint mehrmals als Spalte in der Tabelle mit zusätzlichen Details. Die zusätzliche Detailtabelle enthält auch die ID des Ortes, an dem das Ereignis aufgetreten ist.
OK nach all dem, was ich versuche zu erreichen, ist für jeden Ort die Summe der Ereignisse, die dort passiert sind. Ich weiß, es klingt sehr spezifisch, aber es ist, was der Kunde gefragt hat.
Jedenfalls, was ich versuche zu erreichen: NewYork 60, Chicago 20, Houston 10 Dann werden die USA 90 haben. Und es hat mehrere Ebenen.
So ist das, was ich versuche zu tun:
Zusammenfassung Summe in SQL (Joins)

With C(ID, NAME, COUNTT, ROOT_ID) as 
    (
     SELECT d.ID, d.NAME, 
      (SELECT COUNT(LX.ID) as COUNTT 
      FROM EXTRA LX 
      RIGHT JOIN d ON LX.PLACE_ID = d.ID -- **** 
      GROUP BY d.ID, d.NAME), 
      d.ID as ROOT_ID 
     FROM PLACES d 
     UNION ALL 
     SELECT d.ID, d.NAME, 
      (SELECT COUNT(LX.ID) as COUNTT 
      FROM EXTRA LX 
      RIGHT JOIN d ON LX.PLACE_ID = d.ID 
     GROUP BY d.ID, d.NAME), 
     C.ROOT_ID 
     FROM PLACES dx 
      INNER JOIN C ON dx.PARENT_ID = C.ID 
    ) 
    SELECT p.ID, p.NAME, S.SumIncludingChildren 
    FROM places p 
     INNER JOIN (
     SELECT ROOT_ID, SUM(COUNTT) as SumIncludingChildren 
     FROM C 
     GROUP BY ROOT_ID 
     ) S 
     ON p.ID = S.ROOT_ID 
    ORDER BY p.ID; 


Die Details Tabelle ihre Daten nur für die Ansicht ist. Ich füge das später hinzu. Es werden nur die jeweiligen Spalten verglichen. Damit es funktioniert, brauche ich das nicht. Nur für die Website-Daten.
Es funktioniert nicht, weil es das 'd' nicht erkennt, wo das '****' ist. Wenn ich eine "neue Instanz" dieser Tabelle anlege, wird es auch nicht funktionieren. Also habe ich versucht zu replizieren, was der richtige beitreten, indem Sie 'NOT EXISTS IN' auf eine Abfrage, die alle Orte anstelle der richtigen Join ... on erhält. Gleiches Problem.
Vielleicht bekomme ich nichts. Aber ich suche wirklich eine Lösung und eine Erklärung. Ich weiß, dass mein Code nicht perfekt ist. Vielen Dank im Voraus.

EDIT: Ich verwende OracleSQL auf Toad 10,6

+0

Vielleicht könnten Sie ab Ihrer Tabellen hinzufügen? – sers

Antwort

1
create table p(id number, up number, name varchar2(100)); 
create table e(id number, pid number, dsc varchar2(100)); 

insert into p values (1, null, 'country'); 
insert into p values (2, 1, 'center'); 
insert into p values (3, 1, 'province'); 
insert into p values (4, 2, 'capital'); 
insert into p values (5, 2, 'suburb'); 
insert into p values (6, 3, 'forest'); 
insert into p values (7, 3, 'village'); 
insert into p values (8, 7, 'shed'); 
insert into p values (9, 2, 'gov'); 

insert into e values (1, 8, 'moo'); 
insert into e values (2, 8, 'clank'); 
insert into e values (3, 7, 'sowing'); 
insert into e values (4, 6, 'shot'); 
insert into e values (5, 6, 'felling'); 
insert into e values (6, 5, 'train'); 
insert into e values (7, 5, 'cottage'); 
insert into e values (8, 5, 'rest'); 
insert into e values (9, 4, 'president'); 
insert into e values (10,1, 'GNP'); 
commit; 

with 
    places as 
    (select id, 
      up, 
      connect_by_root id as root, 
      level lvl 
     from p 
    connect by prior id = up), 
    ev_stats as 
    (select root as place, max(lvl) as max_lvl, count(e.id) as ev_count 
     from places left outer join e 
     on places.id = e.pid 
    group by root) 
select max_lvl, p.name, ev_count 
    from ev_stats inner join p on p.id = ev_stats.place 
order by max_lvl desc; 
+0

Hey, es scheint zu funktionieren. Vielleicht muss ich es ein bisschen zwicken. Aber kannst du ein bisschen erklären, was du hier gemacht hast? Ich habe Schwierigkeiten zu verstehen. –

+0

@AmitToren 'places' Unterabfragekonstrukte Menge von Bäumen (Ketten root-> branch-> leaf um genauer zu sein (probiere' sys_connect_by_path (id, '->')) Pfad um zu visualisieren)). Jeder Ort produziert seinen eigenen Baum (Kette). Opa, Vater, Sohn und Tochter werden produzieren: (Opa -> Vater -> Sohn, Opa -> Vater -> Tochter, Opa -> Vater, Opa, Vater -> Sohn, Vater -> Tochter, Vater, Sohn, Tochter). 'ev_stats' Unterabfrage verbindet Bäume mit Ereignissen, die im Blattknoten stattfanden und gruppiert Ereignisse nach root. So sammelt Opa seine eigenen Ereignisse, die eigenen Ereignisse des Vaters und die Ereignisse der Kinder, usw. Letzte Abfrage verbindet Statistiken mit Namen. –

+0

Erstaunlich. Danke vielmals. –