Detta är inte testat eftersom jag inte har en mssql-installation här eller dina data, men jag tycker att det generellt sett borde vara rätt och åtminstone driva dig i en användbar riktning.
Först måste du ändra frågan i din UDF för att ge ytterligare två delar av information. Den "översta" medarbetaren för att din aggregering kollapsar (vilket jag tror att du sa är den första direktrapporten, inte den allra högsta anställde), och det övergripande djupet. Som sådan:
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
Sedan behöver din faktiska fråga lite extra detaljer för att extrahera den informationen och använda den
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
Det dubbla anropet till din UDF kan vara lite dyrt, så du kanske vill överväga att lägga detta i en sproc och använda en temporär tabell för att fånga resultaten av UDF att gå med i.
Notera också att UDF kan ta en extra parameter för hur djupt "överst" är, vilket gör detta mer allmänt att det för närvarande är i sin hårdkodade form.