想出算法:计算每家公司的全部收益

Think up algorithm: Calculate full earnings for every company

我有一个包含公司的 TreeView。每个公司都可以有子公司,每个子公司都可以有子公司,并且可以一直持续到无穷大。 每个公司都有自己的收益,并且有等于该公司所有子公司的总和的 FullEarnings。

如果已知每家公司的收益,我需要计算每家公司的收益。

示例:

CompanyName  | OwnEarnings | FullEarnings
 -Company1   | 25K$        | 53K$
 --Company2  | 13K$        | 18K$
 ---Company3 | 5K$
 --Company4  | 10K$

我有一个数据库列 ParentID,link 用于标识母公司。

我该怎么做?也许通过递归?

无论哪种方式,您都需要递归更新 table。

在你的情况下,它看起来像:

with C as
(
  select T.Id,
         T.Earnings,
         T.Id as RootID
  from T
  union all
  select T.Id,
         T.Earnings,
         C.RootID
  from T
    inner join C 
      on T.ParentId = C.Id
)
select T.Id,
       T.ParentId,
       T.CompanyName,
       T.Earnings,
       S.FullEarnings
from T
  inner join (
             select RootID,
                    sum(Earnings) as FullEarnings
             from C
             group by RootID
             ) as S
    on T.Id = S.RootID
order by T.Id
option (maxrecursion 0);

SQL Fiddle example

为了更新,您需要使用 update 查询更改 select,如此 SQL Fiddle example

中所示