इसका परीक्षण नहीं किया गया है क्योंकि मेरे पास यहां न तो mssql इंस्टॉल है और न ही आपका डेटा, लेकिन, मुझे लगता है कि यह आम तौर पर सही होना चाहिए और कम से कम आपको एक उपयोगी दिशा में धकेलना चाहिए।
सबसे पहले, आपको दो अतिरिक्त जानकारी देने के लिए अपने यूडीएफ में क्वेरी को बदलना होगा। आपके एकत्रीकरण के पतन के लिए "सर्वोच्च" कर्मचारी (जो मुझे लगता है कि आपने पहली प्रत्यक्ष रिपोर्ट है, न कि बहुत शीर्ष कर्मचारी), और समग्र गहराई। जैसे:
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
आपके यूडीएफ को डबल कॉल थोड़ा महंगा हो सकता है, इसलिए आप इसे एक स्पोक में डालने और यूडीएफ के परिणामों को पकड़ने के लिए एक अस्थायी तालिका का उपयोग करने पर विचार करना चाहेंगे।
यह भी ध्यान दें कि यूडीएफ एक अतिरिक्त पैरामीटर ले सकता है कि "सबसे ऊपर" कितना गहरा है, जिससे यह अधिक सामान्य हो जाता है कि यह वर्तमान में अपने हार्डकोडेड रूप में है।