Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Oblicz sumę wartości w drzewie (zapytanie rekurencyjne)

Twoja próba przy użyciu LEAD nie będzie działać, ponieważ nie sumuje wszystkich poprzednich poziomów, a identyfikatory muszą być sekwencyjne.

Rozwiń najpierw pełną hierarchię dla każdego pracownika, tak aby każdy pracownik był uwzględniony raz na poziomie hierarchii:

;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 ON DELETE wyzwalacz

  2. Co jest szybsze COALESCE CZY ISNULL?

  3. przekaż parametr w funkcji o wartościach tabelarycznych za pomocą instrukcji select

  4. SQL Server - brak NATURAL JOIN / x JOIN y USING(pole)

  5. Jak zacząć korzystać z programu SQL Server na platformie Azure