次のようなことを試すことができます:
WITH hierarchified AS (
SELECT
sno,
amount,
hierarchyID = CAST(sno AS varchar(500))
FROM yourTable
WHERE pid = 0
UNION ALL
SELECT
t.sno,
t.amount,
hierarchyID = CAST(h.hierarchyID + '/' + RTRIM(t.sno) AS varchar(500))
FROM yourTable t
INNER JOIN hierarchified h ON t.pid = h.sno
)
UPDATE yourTable
SET total = t.amount + ISNULL(
(
SELECT SUM(amount)
FROM hierarchified
WHERE hierarchyID LIKE h.hierarchyID + '/%'
),
0
)
FROM yourTable t
INNER JOIN hierarchified h ON t.sno = h.sno;
このクエリ ( SQL Fiddle で試すことができます) は、大規模なデータセットではおそらくあまり効率的ではないことに注意してください。これは 1 回限りのクエリとして機能する可能性があり、その場合は、テーブルが更新されるたびに合計を更新するように編成する (つまり、トリガーを使用する) 方がよいでしょう。