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

rekurencyjna funkcja sql z logiką zbiorczą?

Nie jest to testowane, ponieważ nie mam tutaj instalacji mssql ani twoich danych, ale myślę, że ogólnie powinno to być poprawne i przynajmniej popchnąć cię w użytecznym kierunku.

Najpierw musisz zmienić zapytanie w swoim UDF, aby podać dwie dodatkowe informacje. „Najwyższy” pracownik za załamanie się agregacji (co, jak sądzę, powiedziałeś, że jest pierwszym bezpośrednim podwładnym, a nie najwyższym pracownikiem) i ogólna głębokość. W związku z tym:

WITH yourcte AS  
  (  
    SELECT EmployeeId, ManagerNTID, ManagerID, NTID, FullName, 0 as Depth, ntid as Topmost  
    FROM Employees  
    WHERE NTID = @NTID
    UNION ALL  
    SELECT e.EmployeeId, e.ManagerNTID, e.ManagerID, e.NTID, e.FullName, y.Depth+1, case when y.depth = 0 then e.ntid else y.Topmost end
    FROM Employees e  
    JOIN yourcte y ON e.ManagerNTID = y.NTID
  )  
SELECT EmployeeId, ManagerID, NTID, FullName, Depth, Topmost  
FROM yourcte

Następnie Twoje rzeczywiste zapytanie wymaga kilku dodatkowych szczegółów, aby wyodrębnić te informacje i wykorzystać je

SELECT 
  e.FullName, 
  Urgent, 
  High, 
  Medium, 
  Low
FROM fnGetEmployeeHierarchyByUsername ('ssalvati') e
LEFT OUTER JOIN(
    SELECT [AssignedTo],
           SUM([1-Urgent]) AS Urgent,
           SUM([2-High]) AS High,
           SUM([3-Medium]) AS Medium,
           SUM([4-Low]) AS Low
      FROM (SELECT [AssignedTo],[BusinessSeverity] FROM Defects WHERE Status <> 'Closed') D
      join fnGetEmployeeHierarchyByUsername ('ssalvati') e2 on d.AssignedTo = e2.ntid
     PIVOT (COUNT([BusinessSeverity]) FOR [BusinessSeverity] IN ([1-Urgent],[2-High],[3-Medium],[4-Low])) V
     where e2.TopMost = e.ntid
    GROUP BY [AssignedTo]) AS def
ON e.ntid = def.[AssignedTo]
where e.Depth <= 1

Podwójne wywołanie Twojego UDF może być trochę drogie, więc możesz rozważyć umieszczenie tego w sproc i użycie tabeli tymczasowej do przechwycenia wyników UDF, przeciwko którym można się przyłączyć.

Zwróć też uwagę, że UDF może przyjąć dodatkowy parametr określający, jak głęboko jest „najwyższy”, czyniąc to bardziej ogólnym, że obecnie jest w formie zakodowanej na sztywno.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. podziel zakres dat na miesiące

  2. Nazwane wystąpienie programu SQL Server z projektem Instalatora programu Visual Studio 2017

  3. Używasz Web.Config do konfigurowania parametrów połączenia z bazą danych SQL?

  4. Narzędzia do zarządzania SQL Server 2017

  5. Wydajność zwraca rekordy bazy danych przy użyciu LinqToSql?