Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

hàm sql đệ quy với logic cuộn lên?

Điều này không được kiểm tra vì tôi không có cài đặt mssql ở đây cũng như dữ liệu của bạn, nhưng, tôi nghĩ nó nói chung là đúng và ít nhất sẽ thúc đẩy bạn theo hướng hữu ích.

Trước tiên, bạn cần thay đổi truy vấn trong UDF của mình để cung cấp hai phần thông tin bổ sung. Nhân viên "cao nhất" cho sự sụp đổ tổng hợp của bạn (mà tôi nghĩ bạn đã nói là báo cáo trực tiếp đầu tiên, không phải là nhân viên cao nhất) và chiều sâu tổng thể. Như vậy:

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

Sau đó, truy vấn thực tế của bạn cần một vài chi tiết bổ sung để trích xuất thông tin đó và sử dụng nó

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

Việc gọi hai lần tới UDF của bạn có thể hơi tốn kém, vì vậy bạn có thể cân nhắc việc đưa nó vào một chuỗi và sử dụng bảng tạm thời để nắm bắt các kết quả của UDF để tham gia vào.

Cũng lưu ý rằng UDF có thể nhận thêm một tham số về độ sâu của "trên cùng", làm cho điều này trở nên tổng quát hơn rằng nó hiện đang ở dạng mã cứng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. VỚI CHECK ADD CONSTRAINT, sau đó là CHECK CONSTRAINT so với ADD CONSTRAINT

  2. SQL Server 2008 Spatial:tìm một điểm trong đa giác

  3. Tìm ngày không hợp lệ trong SQL Server 2008

  4. JSON_MODIFY () Ví dụ trong SQL Server (T-SQL)

  5. bổ sung ngày tháng trong hàm sql