Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

fonction sql récursive avec logique de cumul?

Ce n'est pas testé car je n'ai pas d'installation mssql ici ni vos données, mais je pense que cela devrait être généralement correct et au moins vous pousser dans une direction utile.

Tout d'abord, vous devez modifier la requête dans votre UDF pour fournir deux informations supplémentaires. L'employé "le plus haut" pour votre agrégation s'effondre (ce que vous avez dit, je pense, est le premier rapport direct, pas l'employé le plus haut), et la profondeur globale. En tant que tel :

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

Ensuite, votre requête réelle a besoin de quelques détails supplémentaires pour extraire ces informations et les utiliser

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

Le double appel à votre UDF peut être un peu coûteux, vous pouvez donc envisager de le mettre dans un sproc et d'utiliser une table temporaire pour récupérer les résultats de l'UDF à joindre.

Notez également que l'UDF pourrait prendre un paramètre supplémentaire quant à la profondeur de "la plus haute", ce qui la rend plus générale qu'elle ne l'est actuellement dans sa forme codée en dur.