Dette er ikke testet, da jeg ikke har en mssql-installation her eller dine data, men jeg synes, det generelt burde være rigtigt og i det mindste skubbe dig i en nyttig retning.
Først skal du ændre forespørgslen i din UDF for at give to yderligere oplysninger. Den "øverste" medarbejder til at din aggregering kollapser (hvilket jeg tror du sagde er den første direkte rapport, ikke den allerbedste medarbejder), og den overordnede dybde. 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
Derefter har din faktiske forespørgsel brug for et par ekstra detaljer for at udtrække disse oplysninger og bruge dem
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
Dobbeltkaldet til din UDF kan være lidt dyrt, så du kan overveje at sætte dette ind i en sproc og bruge en midlertidig tabel til at fange resultaterne af UDF'en, du kan deltage i.
Bemærk også, at UDF kan tage en ekstra parameter med hensyn til, hvor dybt "øverst" er, hvilket gør dette mere generelt, at det i øjeblikket er i sin hårdkodede form.