Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Calculer la somme des valeurs dans l'arbre (requête récursive)

Votre tentative avec LEAD ne fonctionnera pas car il ne fait pas la somme de tous les niveaux précédents et ses ID doivent être séquentiels.

Décomposez d'abord la hiérarchie complète de chaque employé de manière à ce que chaque employé soit inclus une fois par niveau de hiérarchie :

;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