2010-12-08 6 views
0

ich dotn sehen, wie ich die gewünschte Ergebnismenge mit SQL bekommen kann und ich habe trotzig über das Problem und kann nicht die Bäume für den Wald an dieser Stelle seet.sql Profis benötigt, um logisches Problem zu lösen

Was ich habe, ist eine sich selbst referenzierende Mitarbeiter Tabelle (empID, MgrID, empUserName, mehr ...) und ich habe eine Tabelle Defekte, die eine Last von Mängeln hat korreliert zurück zu der Tabelle Mitarbeiter mit dem Feld EmpUserName.

Ich möchte einen Bericht, der eine param eines empID nimmt und erhält alle ihnen zugeordneten Mängel, sowie alle direkten Berichte des param (so, wo die Mitarbeiter .mgrID = @ empid übergeben)

jetzt hier ist der knifflige Teil - die direkten Berichte können ihre eigenen direkten Berichte innerhalb der Hierarchie haben und diese Fehler müssen aufgerollt werden und zu den Fehlernummern der Benutzer der Stufe 1 hinzugefügt werden. Das ist was stopft mich, irgendwelche Ideen dazu? einige Pseudo-Code wäre großartig, um die Logik zu folgen, wie dies getan würde

danke allen!

+0

Lesen Sie dies: http://msdn.microsoft.com/en-us/library/ms186243.aspx – Donnie

+0

@Donnie, im WAK mit der erweiterten Ansicht der Mitarbeiter Hierarchie zu bekommen, aber kann nicht herausfinden eine Möglichkeit, alle Fehlerzählungen für alle Benutzer der Ebene 1 und ihre untergeordneten Elemente zu aggregieren. – kacalapy

+0

Wenn Sie die Erweiterung mit einem rekursiven CTE durchführen, sollten Sie in der Lage sein, sie über die Aggregation am Ende wieder herunterzufahren. Was Sie bisher getan haben, würde mir helfen, genauer zu sein. – Donnie

Antwort

0
alter PROC sel_DefectReportByManagerNTID_rollup 
(@ManagerNTID NVARCHAR(100))  
AS 

CREATE TABLE #DefectCounts 
(
id INT IDENTITY(1, 1) , 
MgrRolledInto NVARCHAR(100) NULL, 
AltBusinessSeverity NVARCHAR(100) NULL, 
DefectCount INT NULL 
); 


CREATE TABLE #directReports 
(
pk INT IDENTITY(1, 1) , 
directReportNTID NVARCHAR(100) NULL 
); 

INSERT INTO #directReports 
SELECT NTID FROM Employees WHERE ManagerNTID = @ManagerNTID 
--select * from #directReports 

DECLARE @maxPK INT; 
SELECT @maxPK = MAX(PK) FROM #directReports 

DECLARE @pk INT; 
SET @pk = 1 


INSERT INTO #DefectCounts (MgrRolledInto,AltBusinessSeverity,DefectCount) 
SELECT @ManagerNTID, d.AltBusinessSeverity, COUNT(*) 
     FROM Defects d 
      JOIN StatusCode C ON C.CodeName = d.Status AND c.scid = 10 
     WHERE d.AssignedTo = @ManagerNTID 
     GROUP BY d.AltBusinessSeverity 


WHILE @pk <= @maxPK 
BEGIN 
    /* Get one direct report at a time to aggregate their defects under them... */ 
    DECLARE @dirRptNTID NVARCHAR(100); 
    SET @dirRptNTID = (SELECT directReportNTID 
         FROM #directReports 
         WHERE PK = @pk) 


    INSERT INTO #DefectCounts (MgrRolledInto,AltBusinessSeverity,DefectCount) 
     SELECT @dirRptNTID, d.AltBusinessSeverity, COUNT(*) 
     FROM Defects d 
      JOIN StatusCode C ON C.CodeName = d.Status AND c.scid = 10 
      JOIN (SELECT * FROM fnGetEmployeeHierarchyByUsername(@dirRptNTID)) emp ON emp.NTID = d.AssignedTo 
     WHERE d.AssignedTo IS NOT NULL 
     GROUP BY d.AltBusinessSeverity 

    SELECT @pk = @pk + 1 
END 



SELECT e.FullName,  
    isnull(Urgent,0) as Urgent,  
    isnull(High,0) as High,  
    isnull(Medium,0) as Medium,  
    isnull(Medium3000,0) as Medium3000,  
    isnull(Low,0) as Low  
FROM ( select * from fnGetEmployeeHierarchyByUsername (@ManagerNTID) where depth <= 1) e  
left outer join (
        SELECT MgrRolledInto,  
          SUM([1-Urgent]) AS Urgent,  
          SUM([2-High]) AS High,  
          SUM([3-Medium]) AS Medium,  
          SUM([3-Medium (3000)]) AS Medium3000, 
          SUM([4-Low]) AS Low  
        FROM #DefectCounts dfs 
        PIVOT 
        (sum(DefectCount) FOR AltBusinessSeverity IN ([1-Urgent],[2-High],[3-Medium],[3-Medium (3000)],[4-Low])) V  
        GROUP BY MgrRolledInto 
       ) def_data on def_data.MgrRolledInto = e.NTID 
order by e.depth 
Verwandte Themen