Esto no está probado ya que no tengo una instalación de mssql aquí ni sus datos, pero creo que en general debería ser correcto y al menos empujarlo en una dirección útil.
Primero, debe cambiar la consulta en su UDF para proporcionar dos datos adicionales. El empleado "más alto" para el colapso de su agregación (que creo que dijo que es el primer informe directo, no el mejor empleado) y la profundidad general. Como tal:
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
Luego, su consulta real necesita algunos detalles adicionales para extraer esa información y usarla
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
La llamada doble a su UDF puede ser un poco costosa, por lo que puede considerar poner esto en un sproc y usar una tabla temporal para capturar los resultados de la UDF para unirse.
También tenga en cuenta que la UDF podría tomar un parámetro adicional en cuanto a qué tan profundo es "superior", lo que hace que esto sea más general de lo que es actualmente en su forma codificada.