Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

fungsi sql rekursif dengan logika rollup?

Ini tidak diuji karena saya tidak menginstal mssql di sini atau data Anda, tetapi, saya pikir itu harus benar secara umum dan setidaknya mendorong Anda ke arah yang bermanfaat.

Pertama, Anda perlu mengubah kueri di UDF Anda untuk memberikan dua informasi tambahan. Karyawan "paling atas" untuk agregasi Anda runtuh (yang saya pikir Anda katakan adalah laporan langsung pertama, bukan karyawan paling atas), dan kedalaman keseluruhan. Seperti:

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

Kemudian, kueri Anda yang sebenarnya memerlukan beberapa detail tambahan untuk mengekstrak informasi tersebut dan menggunakannya

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

Panggilan ganda ke UDF Anda mungkin sedikit mahal, jadi Anda mungkin ingin mempertimbangkan untuk memasukkan ini ke dalam sproc dan menggunakan tabel sementara untuk menangkap hasil UDF untuk digabungkan.

Perhatikan juga bahwa UDF dapat mengambil parameter tambahan tentang seberapa dalam "paling atas", menjadikannya lebih umum bahwa saat ini dalam bentuk hardcoded.



  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 Server:Bagaimana cara menyimpan data biner (mis. File Word)?

  2. Ubah 'smalldatetime' menjadi 'datetime2' di SQL Server (Contoh T-SQL)

  3. Skema basis data, peningkatan otomatis

  4. Pilih baris di mana nilai kolom telah berubah

  5. Wildcard Terkemuka Pencarian Teks Lengkap SQL Server