0

我正在尝试编写一条 SQL 语句来获取父级中所有子级的值的总和:

SELECT parent, child, sum(val)
FROM table_a
GROUP BY parent, child
ORDER BY parent, child

这给了我:

Parent1  Child1  123 
Parent1  Child2  456
Parent2  Child1  789
Parent3  Child1   12
Parent3  Child2  345

我想要的是获取所有孩子,而不仅仅是每个父母的父母下方的孩子,如果它没有记录,则为其分配值 0。例如:

Parent1  Child1  123 
Parent1  Child2  456
Parent2  Child1  789
Parent2  Child2    0
Parent3  Child1   12
Parent3  Child2  345

我可以用 GROUP BY 子句做到这一点吗?还是我需要使用子查询?

4

2 回答 2

0

您将不得不交叉连接 table_a 本身,然后跨合成行进行分组。我不确定Oracle的语法,否则我会写一些实际的代码。

于 2012-06-19T21:05:06.733 回答
0

您可以使用内联视图蛮力解决问题,但这可能效率低下

SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2    select 1 parent, 1 child, 123 val from dual union all
  3    select 1, 2, 456 from dual union all
  4    select 2, 1, 789 from dual union all
  5    select 3, 1, 12 from dual union all
  6    select 3, 2, 345 from dual
  7  )
  8  select p.parent, c.child, nvl(sum(val),0)
  9    from (select distinct parent from t) p
 10         cross join (select distinct child from t) c
 11         full outer join t on (t.parent = p.parent and t.child = c.child)
 12*  group by p.parent, c.child
SQL> /

    PARENT      CHILD NVL(SUM(VAL),0)
---------- ---------- ---------------
         2          1             789
         1          2             456
         3          1              12
         1          1             123
         2          2               0
         3          2             345

6 rows selected.
于 2012-06-19T21:06:54.300 回答