Dit is niet getest omdat ik hier geen mssql-installatie heb, noch jouw gegevens, maar ik denk dat het over het algemeen juist zou moeten zijn en je in ieder geval in een nuttige richting zou moeten duwen.
Eerst moet u de query in uw UDF wijzigen om twee extra informatie te geven. De "hoogste" werknemer voor het instorten van uw aggregatie (waarvan ik denk dat u zei dat het de eerste directe ondergeschikte is, niet de allerhoogste werknemer), en de algehele diepte. Als zodanig:
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
Dan heeft je eigenlijke zoekopdracht een paar extra details nodig om die informatie te extraheren en te gebruiken
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
De dubbele aanroep naar je UDF kan een beetje duur zijn, dus je kunt overwegen om dit in een sproc te plaatsen en een tijdelijke tabel te gebruiken om de resultaten van de UDF op te vangen om mee samen te werken.
Merk ook op dat de UDF een extra parameter zou kunnen hebben over hoe diep "topmost" is, waardoor dit algemener is dan het momenteel in zijn hardcoded vorm is.