Это не проверено, так как у меня нет ни установки mssql, ни ваших данных, но, я думаю, это должно быть в целом правильно и, по крайней мере, подтолкнуть вас в полезном направлении.
Во-первых, вынужно изменить запрос в вашей UDF, чтобы дать две дополнительные части информации.«Самый верхний» сотрудник для вашей агрегации агрегатов (я думаю, вы сказали, что это первый прямой отчет, а не самый высокий сотрудник) и общая глубина.Таким образом:
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
Тогда ваш фактический запрос нуждается в нескольких дополнительных деталях, чтобы извлечь эту информацию и использовать ее
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
Двойной вызов вашей UDF может быть немного дороже,поэтому вы можете захотеть поместить это в sproc и использовать временную таблицу, чтобы перехватить результаты UDF для соединения.
Также обратите внимание, что UDF может принять дополнительный параметр относительно глубины "topmost"это делает это более общим, что он в настоящее время находится в жестко закодированной форме.