Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изчисляване на сбор от стойности в дърво (рекурсивна заявка)

Вашият опит да използвате LEAD няма да работи, тъй като не сумира всички предишни нива и идентификаторите трябва да са последователни.

Първо разгънете пълната йерархия за всеки служител, така че всеки служител да бъде включен веднъж на йерархично ниво:

;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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Пет водещи съображения за дизайна на индекс на база данни в SQL Server

  2. Транспонираща таблица

  3. Как да добавите потребителска група на Active Directory като вход в SQL Server

  4. Как да приложа 3 стойности за 1 ред към 3 реда с всяка стойност?

  5. Защо се счита за лоша практика да се използват курсори в SQL Server?