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.