sql >> Databasteknik >  >> RDS >> Sqlserver

rekursiv sql-funktion med rollup-logik?

Detta är inte testat eftersom jag inte har en mssql-installation här eller dina data, men jag tycker att det generellt sett borde vara rätt och åtminstone driva dig i en användbar riktning.

Först måste du ändra frågan i din UDF för att ge ytterligare två delar av information. Den "översta" medarbetaren för att din aggregering kollapsar (vilket jag tror att du sa är den första direktrapporten, inte den allra högsta anställde), och det övergripande djupet. Som sådan:

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

Sedan behöver din faktiska fråga lite extra detaljer för att extrahera den informationen och använda den

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

Det dubbla anropet till din UDF kan vara lite dyrt, så du kanske vill överväga att lägga detta i en sproc och använda en temporär tabell för att fånga resultaten av UDF att gå med i.

Notera också att UDF kan ta en extra parameter för hur djupt "överst" är, vilket gör detta mer allmänt att det för närvarande är i sin hårdkodade form.



  1. MySQL Automatisk ökning av kolumner på TRANSACTION, COMMIT och ROLLBACK

  2. Att få det sista ordet från en Postgres-sträng, deklarativt

  3. Hur man använder STRCMP() för att jämföra 2 strängar i MySQL

  4. Hur bygger man en SQL-sats med hjälp av ID:n som kanske inte är tillgängliga i tabellen?