Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Calcular a soma dos valores na árvore (consulta recursiva)


Sua tentativa usando LEAD não funcionará, pois não está somando todos os níveis anteriores e seus IDs devem ser sequenciais.

Exploda a hierarquia completa para cada funcionário primeiro, de modo que cada funcionário seja incluído uma vez por nível de hierarquia:
;WITH cte 
AS
(
  SELECT e.ID, e.Name, e.ID as sub_ID 
  FROM @Employees e
  -- no WHERE-condition to get all employees
  UNION ALL
  SELECT 
     c.ID, c.Name -- keep the initial employee
     ,e.ID as sub_ID
  FROM @Employees e
    INNER JOIN cte c ON c.sub_ID = e.ParentID
)

SELECT 
     c.ID
    ,c.Name
    -- parent level
    ,sum(case when c.id =  s.EmployeeID then s.Quantity else 0 end) AS ParentSumSales
    -- child level
    ,sum(case when c.id <> s.EmployeeID then s.Quantity else 0 end) AS ChildSumSales
FROM cte c
LEFT JOIN @Sales as s
ON s.EmployeeID = c.sub_ID
group by c.Name, c.id