Ini tidak diuji karena saya tidak menginstal mssql di sini atau data Anda, tetapi, saya pikir itu harus benar secara umum dan setidaknya mendorong Anda ke arah yang bermanfaat.
Pertama, Anda perlu mengubah kueri di UDF Anda untuk memberikan dua informasi tambahan. Karyawan "paling atas" untuk agregasi Anda runtuh (yang saya pikir Anda katakan adalah laporan langsung pertama, bukan karyawan paling atas), dan kedalaman keseluruhan. Seperti:
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
Kemudian, kueri Anda yang sebenarnya memerlukan beberapa detail tambahan untuk mengekstrak informasi tersebut dan menggunakannya
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
Panggilan ganda ke UDF Anda mungkin sedikit mahal, jadi Anda mungkin ingin mempertimbangkan untuk memasukkan ini ke dalam sproc dan menggunakan tabel sementara untuk menangkap hasil UDF untuk digabungkan.
Perhatikan juga bahwa UDF dapat mengambil parameter tambahan tentang seberapa dalam "paling atas", menjadikannya lebih umum bahwa saat ini dalam bentuk hardcoded.