sql >> Database >  >> RDS >> Sqlserver

recursieve sql-functie met rollup-logica?

Dit is niet getest omdat ik hier geen mssql-installatie heb, noch jouw gegevens, maar ik denk dat het over het algemeen juist zou moeten zijn en je in ieder geval in een nuttige richting zou moeten duwen.

Eerst moet u de query in uw UDF wijzigen om twee extra informatie te geven. De "hoogste" werknemer voor het instorten van uw aggregatie (waarvan ik denk dat u zei dat het de eerste directe ondergeschikte is, niet de allerhoogste werknemer), en de algehele diepte. Als zodanig:

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

Dan heeft je eigenlijke zoekopdracht een paar extra details nodig om die informatie te extraheren en te gebruiken

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

De dubbele aanroep naar je UDF kan een beetje duur zijn, dus je kunt overwegen om dit in een sproc te plaatsen en een tijdelijke tabel te gebruiken om de resultaten van de UDF op te vangen om mee samen te werken.

Merk ook op dat de UDF een extra parameter zou kunnen hebben over hoe diep "topmost" is, waardoor dit algemener is dan het momenteel in zijn hardcoded vorm is.



  1. Meerdere Mysql-instructies groeperen om het aantal meerdere statussen op te halen

  2. Rijgrootte te groot (> 8126) kan ik InnoDB gewoon veranderen in MyISAM?

  3. Een SQL Server Agent-taak wijzigen (T-SQL)

  4. bestand wordt niet geüpload in ajax php mysql