Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

रोलअप तर्क के साथ पुनरावर्ती एसक्यूएल समारोह?

इसका परीक्षण नहीं किया गया है क्योंकि मेरे पास यहां न तो 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

आपके यूडीएफ को डबल कॉल थोड़ा महंगा हो सकता है, इसलिए आप इसे एक स्पोक में डालने और यूडीएफ के परिणामों को पकड़ने के लिए एक अस्थायी तालिका का उपयोग करने पर विचार करना चाहेंगे।

यह भी ध्यान दें कि यूडीएफ एक अतिरिक्त पैरामीटर ले सकता है कि "सबसे ऊपर" कितना गहरा है, जिससे यह अधिक सामान्य हो जाता है कि यह वर्तमान में अपने हार्डकोडेड रूप में है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. चूंकि कोई Sqlserver सरणी पैरामीटर नहीं है, आगे बढ़ने का सबसे अच्छा तरीका क्या है?

  2. चुनिंदा स्टेटमेंट का उपयोग करके कई पंक्तियों को अपडेट करें

  3. SQL सर्वर में ORIGINAL_DB_NAME () कैसे काम करता है

  4. टी-एसक्यूएल का उपयोग करके उप-स्ट्रिंग की अंतिम घटना की अनुक्रमणिका पाएं

  5. SQL सर्वर से मेल भेजते समय "प्रोफ़ाइल नाम मान्य नहीं है" ठीक करें