2013-10-30 55 views
2

我正在查找SQL查詢以獲取每個經理或其他表中某些經理的遞歸計數EmployeeSQL查詢獲得每位經理下的員工遞歸計數

表結構是:

EMP_TABLE

Emp_id Manager_id 
1   1 
2   1 
3   1 
4   3 
5   3 
6   5 
7   5 
8   7 
9   7 
10  7 

執行表:

此表只不過是選擇管理者可在這裏。我需要得到這個經理

Manager_id 
    1 
    4 
    7 
    8 

我找下面的輸出

Manager_ID Count_of_Employees 
    1    9 
    4    0 
    7    3 
    8    0 

請注意你的答案向每名僱員的數量僅給出直接報告的員工數爲每個經理只有我好了。布特我正在尋找與經理遞歸員工報告。在我上面的例子中,根據您的查詢,我將獲得Manager_id 1計數爲3,但我在尋找輸出是9.在此先感謝!

感謝您的回覆。我終於得到了查詢。請找到我的答案。

+0

@丹安德魯斯..我不是在尋找下面的查詢。我清楚地表示,我正在尋找名單中的員工數量。我錯過了一些東西。只需要別人的幫助。但有人標記降級問題。 –

+0

什麼? 「我正在查找SQL查詢以獲取Employee的數量。」 – SQLMason

+0

通常在StackOverflow上,人們發佈他們先試過的東西。從那裏,人們可以幫助。如果你收到的答案不是你要找的答案,那麼也許你需要看看你在問什麼。 – SQLMason

回答

4

首先,一個重要的注意事項:的第一行,其中Emp_id==Manager_Id==1不僅沒有意義,而且還會造成無限遞歸。我建議你刪除它。

爲了提供一個答案,不過,我首先創建了消除這種無效的項目視圖,並用那的代替Emp_Table

create view valid_mng as 
select Emp_Id,Manager_id from Emp_Table 
where Emp_Id<>Manager_Id 

所以把它歸結爲以下,用遞歸CTE的幫助不大:

With cte as (
    select Emp_Id,Manager_id from valid_mng 
    union all 
    select c.Emp_Id,e.Manager_Id 
    from cte c join valid_mng e on (c.Manager_Id=e.Emp_Id) 
) 

select m.Manager_Id,count(e.Emp_Id) as Count_of_Employees 
from [Execute] m 
left join cte e on (e.Manager_Id=m.Manager_Id) 
group by m.Manager_Id 

如果你最終拆除違規行(S),或者更好的設置Manager_Id=NULL爲哈勃建議,只需忽略valid_mng視圖並將其替換爲Emp_Table無處不在。

另附註:Execute是MSSQL中的保留字。避免在用戶名字中使用保留字是總是一個很好的練習

+1

@Dhana - 管理員在層次結構(或食物鏈)的頂部由'Manager_Id'表示的NULL是很常見的。它避免陷入管理自己的經理人。 – HABO

+0

@HABO:對。我忘了提到這一點,謝謝。 – geomagas

+0

@geomagas ..這對我有用。謝謝! –

3

可以使用組借:

SELECT count(*) AS Count_of_Employees, 
    Manager_ID 
FROM yourtable 
GROUP BY Manager_ID 
+0

@Sadek ..謝謝!你的回答只給出每個經理的直接報告員工數量,只有我得到。布特我正在尋找經理與recrusive員工報告。在我上面的例子中,根據您的查詢,我將獲得Manager_id 1的計數爲3,但我正在查找輸出結果爲9.感謝您的提前! –

0
SELECT manager_id, 
    count(DISTINCT emp_id) 
FROM emp_table 
GROUP BY manager_id 

UNION 

SELECT manager_id, 
    0 
FROM execute_table 
WHERE manager_id NOT IN (
     SELECT manager_id 
     FROM emp_table 
     ) 
1

你可能想嘗試以下操作:

SELECT MANAGER_ID, 
    COUNT(EMP_ID) AS EMP_COUNT 
FROM EMP_TABLE 
GROUP BY MANAGER_ID 
0
SELECT Manager_Id, 
    Count(Employee_Id) 
FROM Emp_Table 
WHERE Manager_Id IN (
     SELECT Manager_Id 
     FROM Manager 
     ) 
GROUP BY Manager_Id 
0
SELECT COUNT(Emp_id) county, 
    Manager_id 
FROM Emp_Table 
GROUP BY Manager_id 
1
SELECT Manager_id, COUNT(Emp_id) AS Count_of_Employees 
FROM Emp_Table 
WHERE Manager_id IN (1,4,7,8) 
GROUP BY Manager_id 
+0

謝謝你@marc_s,你能告訴我你是如何格式化的嗎?每次我嘗試給出一個SQL格式,都不對。 – simon

+0

如果您發佈代碼,XML或數據示例,只需在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)(左起第二組圖標)很好的格式和語法突出顯示它。或者突出顯示行並按下Ctrl-K進行格式化。 –

+0

再次謝謝你@marc_s! – simon

4

與geomagas相似,但不是從中推導出來的。它遞歸地構建管理報告樹,然後對其進行總結。

declare @Emp_Table as Table (Emp_id Int Identity, Manager_id Int); 
insert into @Emp_Table (Manager_id) values 
    (1), (1), (1), (3), (3), (5), (5), (7), (7), (7); 
select * from @Emp_Table; 

declare @Execute as Table (Manager_id Int); 
insert into @Execute (Manager_id) values 
    (1), (4), (7), (8); 
select * from @Execute; 

with Reports as (
    select Manager_id, Emp_id, Manager_id as Top_Manager_id 
    from @Emp_Table where Manager_id <> Emp_id 
    union all 
    select ET.Manager_id, ET.Emp_id, R.Top_Manager_id 
    from Reports as R inner join 
     @Emp_Table as ET on ET.Manager_id = R.Emp_id 
) 
    select E.Manager_id, Count(R.Emp_id) as Count_Of_Employees 
    from @Execute as E left outer join 
     Reports as R on R.Top_Manager_id = E.Manager_id 
    group by E.Manager_id; 
-1

我的答案...感謝您的幫助。

WITH Emp_Count as 
(
Select Emp_id boss,Emp_id from Emp_Table t 
Where exists (select 1 from Emp_Table Where t.emp_id = Manager_id) 
UNION all 
Select Emp_Count.boss, t.emp_id 
from Emp_Table t join Emp_Count on t.Manager_id = Emp_Count.emp_id 
) 
Select boss, count(*)-1 SubCount 
from Emp_Count 
group by boss 
option (maxrecursion 0) 
+1

這會產生與您的問題所暗示的結果不同的結果。 [我沒有看到包含下屬的經理](http://sqlfiddle.com/#!3/69b58/4),因爲他們在您的示例輸出中。 – geomagas