sql >> Base de Datos >  >> RDS >> Sqlserver

función sql recursiva con lógica de resumen?

Esto no está probado ya que no tengo una instalación de mssql aquí ni sus datos, pero creo que en general debería ser correcto y al menos empujarlo en una dirección útil.

Primero, debe cambiar la consulta en su UDF para proporcionar dos datos adicionales. El empleado "más alto" para el colapso de su agregación (que creo que dijo que es el primer informe directo, no el mejor empleado) y la profundidad general. Como tal:

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

Luego, su consulta real necesita algunos detalles adicionales para extraer esa información y usarla

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

La llamada doble a su UDF puede ser un poco costosa, por lo que puede considerar poner esto en un sproc y usar una tabla temporal para capturar los resultados de la UDF para unirse.

También tenga en cuenta que la UDF podría tomar un parámetro adicional en cuanto a qué tan profundo es "superior", lo que hace que esto sea más general de lo que es actualmente en su forma codificada.