2016-12-05 57 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

令人惊叹。非常感谢。 –