我在SQL Server中使用T-SQL并拥有以下“TEST”表:
CHILD PARENT VAL WEIGHTAGE
============================================================
abcd yz NULL 1
efgh abcd NULL 1
ijkl abcd 70 1
mnop NULL 5 1
qrst efgh 100 1
uvwx efgh 200 -1
yz NULL NULL 1
“CHILD”列包含要显示的所有标签。 “PARENT”列表示递归的父子关系。
例如,“yz”是“abcd”的父级。反过来,“abcd”是“efgh”和“ijkl”的父母。 “efgh”,反过来也是“qrst”和“uvwx”的父母。
可以从数据库加载仅出现在“CHILD”中(但不在“PARENT”中)的值。现在,我想根据递归父子关系自动自动计算剩余的“NULL”值。
因此,最终查询输出将按如下方式计算(它还使用“WEIGHTAGE”列进行计算):
CHILD PARENT VAL WEIGHTAGE
==========================================================================
abcd yz (-100+70)=-30 1
efgh abcd (100-200) = -100 1
ijkl abcd 70 1
mnop NULL 5 1
qrst efgh 100 1
uvwx efgh 200 -1
yz NULL -30 1
感谢您的帮助。感谢。
答案 0 :(得分:1)
这是递归CTE的示例。您的列child
引用当前行的名称,而不是它的子项。这让我很困惑,所以我将列从child
重命名为name
。
; with CTE as
(
select name as root
, name
, parent
, val * weightage as change
from test
union all
select parent.root
, child.name
, child.parent
, child.val * child.weightage as change
from CTE parent
join test child
on child.parent = parent.name
)
select root
, sum(change) as val
from CTE
group by
root
打印:
abcd -30
efgh -100
ijkl 70
mnop 5
qrst 100
uvwx -200
yz -30