sql >> Database teknologi >  >> RDS >> Sqlserver

rekursiv sql-funktion med rollup-logik?

Dette er ikke testet, da jeg ikke har en mssql-installation her eller dine data, men jeg synes, det generelt burde være rigtigt og i det mindste skubbe dig i en nyttig retning.

Først skal du ændre forespørgslen i din UDF for at give to yderligere oplysninger. Den "øverste" medarbejder til at din aggregering kollapser (hvilket jeg tror du sagde er den første direkte rapport, ikke den allerbedste medarbejder), og den overordnede dybde. 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

Derefter har din faktiske forespørgsel brug for et par ekstra detaljer for at udtrække disse oplysninger og bruge dem

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

Dobbeltkaldet til din UDF kan være lidt dyrt, så du kan overveje at sætte dette ind i en sproc og bruge en midlertidig tabel til at fange resultaterne af UDF'en, du kan deltage i.

Bemærk også, at UDF kan tage en ekstra parameter med hensyn til, hvor dybt "øverst" er, hvilket gør dette mere generelt, at det i øjeblikket er i sin hårdkodede form.



  1. Automatisk dataindsamling af databaseskemaændringer i MS SQL Server

  2. MySQL Bestil efter et nummer, null sidst

  3. Forsøger at få de faktiske data, der forårsager en undtagelse

  4. Variationer i PostgreSQL LIKE-forespørgselsydeevne