3

我有一个包含ID,Amount和的表Parent_ID。(实际上它有点复杂,但这是本示例的所有重要列)。基本上我想要做的是按最低的公共父级(即父级ID为NULL的那些)对Amount列进行分组和求和。

ID  Amount  Parent_ID
1   100     NULL
2   150     1
3   50      1
4   75      3
5   25      4
6   125     NULL
7   50      6
8   50      7
9   100     8

预期成绩:

ID  SUM
1   400
6   325

如您所见,它只返回两条记录,即没有父项的记录,这意味着它们是顶级项目。Sum 列是其所有子项的Amount递归总和,因此ID= 1 是 1、2、3、4 和 5 的总和。ID= 6 是 6、7、8 和 9 的总和。

4

2 回答 2

6

如果您可以定义层次结构中的级别数量限制,则可以将此解决方案扩展到任意数量的级别:

select
    coalesce(t5.ID,t4.ID,t3.ID,t2.ID,t1.ID) as Root,
    sum(t1.Amount) as Amount
from Table1 t1
left join Table1 t2 on t1.Parent_ID = t2.ID
left join Table1 t3 on t2.Parent_ID = t3.ID
left join Table1 t4 on t3.Parent_ID = t4.ID
left join Table1 t5 on t4.Parent_ID = t5.ID
group by Root

只需left join根据需要添加更多并将它们添加到coalesce.

演示:http ://www.sqlfiddle.com/#!2/b7a79/17

于 2012-04-20T18:10:15.950 回答
0

为了实现您正在寻找的东西,您将需要一个递归存储过程,因为您不想要将您限制在结构深度的东西。

我认为更改数据结构会更容易。添加一列,将每个子级与其顶级父级相关联。这样,您就可以通过简单的GROUP BY.

于 2012-04-20T18:01:39.867 回答