Điều này không được kiểm tra vì tôi không có cài đặt mssql ở đây cũng như dữ liệu của bạn, nhưng, tôi nghĩ nó nói chung là đúng và ít nhất sẽ thúc đẩy bạn theo hướng hữu ích.
Trước tiên, bạn cần thay đổi truy vấn trong UDF của mình để cung cấp hai phần thông tin bổ sung. Nhân viên "cao nhất" cho sự sụp đổ tổng hợp của bạn (mà tôi nghĩ bạn đã nói là báo cáo trực tiếp đầu tiên, không phải là nhân viên cao nhất) và chiều sâu tổng thể. Như vậy:
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
Sau đó, truy vấn thực tế của bạn cần một vài chi tiết bổ sung để trích xuất thông tin đó và sử dụng nó
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
Việc gọi hai lần tới UDF của bạn có thể hơi tốn kém, vì vậy bạn có thể cân nhắc việc đưa nó vào một chuỗi và sử dụng bảng tạm thời để nắm bắt các kết quả của UDF để tham gia vào.
Cũng lưu ý rằng UDF có thể nhận thêm một tham số về độ sâu của "trên cùng", làm cho điều này trở nên tổng quát hơn rằng nó hiện đang ở dạng mã cứng.