Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

рекурсивна sql функция с сборна логика?

Това не е тествано, тъй като нямам инсталиран mssql тук, нито вашите данни, но мисля, че като цяло трябва да е правилно и поне да ви тласне в полезна посока.

Първо, трябва да промените заявката във вашия UDF, за да предоставите две допълнителни части от информацията. „Най-горният“ служител за срива на вашата агрегация (което мисля, че казахте, че е първият пряк доклад, а не най-добрият служител) и общата дълбочина. Като такъв:

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

След това действителната ви заявка се нуждае от няколко допълнителни подробности, за да извлече тази информация и да я използва

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

Двойното извикване на вашия UDF може да е малко скъпо, така че може да обмислите поставянето на това в sproc и използването на временна таблица, за да уловите резултатите от UDF, срещу които да се присъедините.

Също така имайте предвид, че UDF може да приеме допълнителен параметър за това колко дълбоко е „най-горният“, което прави това по-общо, че в момента е в твърдо кодираната си форма.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкване на заявка в SQL функция

  2. Как да замените низ, ако записът е NULL в T-SQL

  3. Сортиране въз основа на следващ и предишен запис в SQL

  4. SQL Server:Как да съхранявате двоични данни (напр. Word файл)?

  5. Съхранена процедура и разрешения - достатъчно ли е EXECUTE?