Toto není testováno, protože zde nemám instalaci mssql ani vaše data, ale myslím, že by to mělo být obecně správné a alespoň vás to posouvat užitečným směrem.
Nejprve musíte změnit dotaz ve vašem UDF tak, aby poskytl dvě další informace. „Nejvyšší“ zaměstnanec pro kolaps vaší agregace (o kterém si myslím, že jste řekl, že je první přímá podřízená, ne úplně top zaměstnanec), a celková hloubka. Jako takový:
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
Poté váš skutečný dotaz potřebuje několik dalších podrobností, aby mohl tyto informace extrahovat a použít
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
Dvojité volání do vašeho UDF může být trochu drahé, takže možná budete chtít zvážit jeho zařazení do sproc a použití dočasné tabulky k zachycení výsledků UDF, ke kterému se chcete připojit.
Všimněte si také, že UDF může mít další parametr, pokud jde o to, jak hluboko je „topmost“, takže je to obecnější, než v současnosti ve své pevně zakódované podobě.