sql >> Databáze >  >> RDS >> Sqlserver

rekurzivní funkce SQL s logikou rollup?

Toto není testováno, protože zde nemám instalaci mssql ani vaše data, ale myslím, že by to mělo být obecně správné a alespoň vás to posouvat užitečným směrem.

Nejprve musíte změnit dotaz ve vašem UDF tak, aby poskytl dvě další informace. „Nejvyšší“ zaměstnanec pro kolaps vaší agregace (o kterém si myslím, že jste řekl, že je první přímá podřízená, ne úplně top zaměstnanec), a celková hloubka. Jako takový:

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

Poté váš skutečný dotaz potřebuje několik dalších podrobností, aby mohl tyto informace extrahovat a použít

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

Dvojité volání do vašeho UDF může být trochu drahé, takže možná budete chtít zvážit jeho zařazení do sproc a použití dočasné tabulky k zachycení výsledků UDF, ke kterému se chcete připojit.

Všimněte si také, že UDF může mít další parametr, pokud jde o to, jak hluboko je „topmost“, takže je to obecnější, než v současnosti ve své pevně zakódované podobě.



  1. Schéma SQL serveru a výchozí schéma

  2. Jak provést automatické zvýšení v PostgreSQL?

  3. pyodbc správně nepracuje s daty unicode

  4. Hromadné vkládání jádra SQLAlchemy je pomalé