Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 sql专业人员需要解决逻辑问题_Sql Server 2005 - Fatal编程技术网

Sql server 2005 sql专业人员需要解决逻辑问题

Sql server 2005 sql专业人员需要解决逻辑问题,sql-server-2005,Sql Server 2005,我不知道如何使用SQL获得所需的结果集,而且我已经大胆地考虑了这个问题,目前还看不到问题所在 我拥有的是一个自引用的empID、MgrID、empUserName等employees表。。。 我有一个缺陷表,其中有大量缺陷,这些缺陷使用empUserName字段关联回employees表 我想要一个报告,它接受empID的一个参数并获取分配给它们的所有缺陷,以及该参数的所有直接报告,以便employees.mgrID=@empID传入 现在是棘手的部分-直接下属可能在层次结构中有自己的直接下属,

我不知道如何使用SQL获得所需的结果集,而且我已经大胆地考虑了这个问题,目前还看不到问题所在

我拥有的是一个自引用的empID、MgrID、empUserName等employees表。。。 我有一个缺陷表,其中有大量缺陷,这些缺陷使用empUserName字段关联回employees表

我想要一个报告,它接受empID的一个参数并获取分配给它们的所有缺陷,以及该参数的所有直接报告,以便employees.mgrID=@empID传入

现在是棘手的部分-直接下属可能在层次结构中有自己的直接下属,这些缺陷需要汇总并添加到级别1用户的缺陷数量中。这让我很难受,有什么想法吗?一些伪代码将很好地遵循如何做到这一点的逻辑


谢谢大家

阅读此文:@Donnie,我使用cte获取员工层次结构的扩展视图,但无法找到一种方法来汇总所有1级用户及其下属的所有缺陷计数。如果您使用递归cte进行扩展,您应该能够在最后通过聚合将其折叠回去。到目前为止,您所做的将帮助我更具体。@Donnie-看看这个,它让我获得了perefect resultset,但没有按照我的要求汇总1级儿童计数:
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