2016-12-05 98 views
3

我在彙總中對查詢中的某些列進行求和時遇到了一些麻煩。 描述發生了什麼有點困難,但我會盡我所能:
我有3個表 - 細節,額外的細節和地方。 地方是一張表,包含世界上的地方。詳細信息包含有關發生的事件的詳細信息,額外的詳細信息提供了有關事件的更多數據
每個地方有一個ID和一個ParentID(像紐約有一個ID,它的父母IDUS。類似的東西)。事件(詳細信息)的ID作爲額外詳細信息表中的列出現多次。額外的詳細信息表格還包含該事件發生地點的ID
好了畢竟,我試圖實現的是,對於每個地方,發生在那裏的事件的總和。我知道這聽起來很具體,但這是客戶要求的。
無論如何,我試圖去的例子: 紐約60,芝加哥20,休斯頓10然後美國將有90.它有幾個層次。
所以這就是我要怎樣做:
SQL中的聚合總和(加入)

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; 


詳細資料表格僅用於展示他們的數據。稍後我會補充。它只是比較各個列。爲了使它工作,我不需要那個。僅用於網站數據。
它不起作用,因爲它不識別'****'所在的'd'。如果我將該表格的「新實例」放入其中,它也不起作用。所以我試圖複製什麼正確的加入做'NOT EXISTS IN'查詢獲取所有的地方,而不是正確的加入...上。同樣的問題。
也許我沒有得到什麼。但我真的在尋求解決方案和一些解釋。我知道我的代碼並不完美。 在此先感謝。

編輯:我使用的是蟾蜍10.6

+0

OracleSQL也許你可以添加表的說明? – sers

回答

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

嘿,它似乎工作。也許我需要稍微微調一下。但是,你能解釋一下你在這裏做了什麼嗎?我很難理解。 –

+0

@AmitToren'places'子查詢構造一組樹(chain root-> branch-> leaf更具體(嘗試'sys_connect_by_path(id,' - >')path'來形象化))。每個地方都產生它自己的樹(鏈)。爺爺,爸爸,兒子和女兒會出示一套:(爺爺 - >爸爸 - >兒子,爺爺 - >爸爸 - >女兒,爺爺 - >爸爸,爺爺,爸爸 - >兒子,爸爸 - >女兒,爸爸,兒子,女兒)。 'ev_stats'子查詢將發生在葉節點中的事件與由樹根組成的事件組合在一起。所以爺爺收集他自己的事件,爸爸自己的事件和兒童事件等。最終查詢加入名稱統計。 –

+0

令人驚歎。非常感謝。 –