3

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

ご覧のとおり、親がないレコードは2つのレコードのみを再調整します。つまり、これらはトップレベルのアイテムです。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 に答える