我有一个包含ID
,Amount
和Parent_ID
的表格。 (实际上它有点复杂,但这是本例中的所有重要列)。基本上我想要做的是将Amount列与最低公共父级(即父ID为NULL的那些)进行分组和总和。
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。
答案 0 :(得分: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
中的列列表中。
答案 1 :(得分:0)
要实现您正在寻找的东西,您需要一个递归存储过程,因为您不需要某些能够限制结构深度的东西。
我认为更改数据结构会更容易。添加一个列,将每个子项与其顶级父项相关联。这样你就可以通过一个简单的GROUP BY
来获得你想要的东西。