2010-12-08 9 views
0

私はどのように私はSQLを使用して希望の結果セットを得ることができます参照してくださいと私は挑戦的に問題を考えていないし、SQLのプロは、論理的な問題を解決するために必要です

と私はempUserNameフィールドを使用して従業員のテーブルに戻って関連付けられた欠陥の負荷を持っている欠陥テーブルを持っている(empID、MgrID、empUserName、more ...)自己参照従業員テーブルです。

は、私は今ここに(その従業員は.mgrID = @ EMPIDで渡された)のparamの直属

のすべてと同様、EMPIDのPARAMを取り、それらに割り当てられたすべての欠陥を取得したレポートをしたいです直接的なレポートは階層内で独自の直接レポートを持つことがあり、これらの不具合はロールアップされ、レベル1のユーザーの不具合数に追加される必要があります。これは私に悩まされている何か、これに関するアイデアですか?いくつかの擬似コードは、これがどのように行われるかのロジックに従うことが大変です。

ありがとうございました!

+0

これを読んで:http://msdn.microsoft.com/en-us/library/ms186243.aspx – Donnie

+0

@Donnie、イム従業員の階層の拡大図を得るために、CTEを使用しますが、把握カントすべてのレベル1ユーザーとその部下のすべての欠陥数を集計する方法。 – kacalapy

+0

再帰的なCTEで展開を行っている場合は、最後に集約することで折りたたむことができます。あなたがこれまで行ってきたことは、私がより具体的になるのを助けるでしょう。 – Donnie

答えて

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 
関連する問題