我想知道如何使用SQL获得所需的结果集,并且我已经过度思考了这个问题,并且此时不能为树林寻找树木。
我所拥有的是一个自引用员工表(empID,MgrID,empUserName,更多......) 我有一个缺陷表,它有一堆缺陷,使用empUserName字段与employees表相关联。
我想要一个带有empID参数的报告,并获取分配给它们的所有缺陷,以及所有参数的直接报告(所以员工.mgrID = @ empid传入的地方)
现在这里是棘手的部分 - 直接报告可能在层次结构中有自己的直接报告,这些缺陷需要汇总并添加到1级用户的缺陷数量中。这是什么让我感到困惑,对此有任何想法?一些伪代码可以很好地遵循如何完成的逻辑
谢谢大家!
答案 0 :(得分: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