2017-04-15 183 views
0

SELECT e.ManagerID, count(*) as NumberOfDepartments From HumanResources.Employee e, Person.Contact c where e.ContactID = c.ContactID group by e.ManagerID;無法弄清楚如何連接表

的目標是寫一個報告,以顯示經理和他們獨特的監督不同的部門數量的經理ID,名字和姓氏。只顯示監督大多數部門的經理。 我必須確保所有員工都在僱用(即enddate不包含日期)。 上面的代碼正在顯示編號managerid和他運行的部門數量,但每當我嘗試把名字和姓氏放在我不得不把他們也放在'group by'子句,這樣,它使整個報告變得瘋狂。請幫忙。
Database Here

+1

(一)如何你能認識一個經理嗎? –

+0

(b)經理必須當前被佔用,您沒有在查詢中添加此項。 –

+0

如果managerID中有值,則表示他/她是經理 – Obi

回答

1

從您的模式,似乎在EmployeemanagerID列都將填充經理對於員工的ID。這可以解釋爲什麼當添加firstNamelastName時,報告變得很瘋狂,因爲您將按員工姓名而非經理人進行分組。

沒有看到表格內容很難說,但你可能會認爲不是managerID填充。

如果是這樣的話,你可以寫這樣的查詢

select e.EmployeeID, c.firstName, e.lastName, count(distinct edh.DepartmentID) 
from Employee e 
join Contact c 
on  e.ContactID = c.ContactID 
join Employee e2 
on  e1.EmployeeID = e2.ManagerID 
join EmployeeDepartmentHistory edh 
on  e2.EmployeeID = edh.EmployeeID 
where e.ManagerID is null and edh.EndDate is null 
group by e.EmployeeID, c.firstName, e.lastName 

Employee表的第一個實例是管理者(因爲你設置where e.ManagerID is null),連接與Contact讓你的經理的名字,Employee的第二個實例可讓您獲得由每位經理管理的所有人員,並且加入EmployeeDepartmentHistory可讓您獲得他們的部門(您指望)和他們的EndDate,這必須是null以確保他們目前處於就業狀態。

編輯

請注意我寫的連接方式;把它們寫成你的from子句中的逗號分隔表名,中的連接條件是a bad habit that should be kicked,因爲它使得閱讀,維護和更改它們更加困難。這就是爲什麼join在SQL語言於1992年

+0

偉大的工作和解釋,斯特凡諾。但我不明白員工和聯繫人之間的一對多關係;他們不應該分享一個關鍵? –

+0

關於'JOIN',如果它們是在1992年推出的,那麼SQL花費了太多時間來採用它,它從一開始就在關係代數中(我認爲)。然而,我認爲我們誇大了「踢壞習慣的壞習慣」:'select * from a,b'是一個'CROSS JOIN',儘管我自己從來沒有使用它(除非在極少數情況下我需要笛卡爾積),它仍然是一個完全合法的SQL構造。 –

+0

@GiorgosAltanis關於連接,我編輯我的答案是更準確,因爲你顯然是正確的,'join'一直存在於關係代數中,而且「踢壞的習慣」主要應用於'inner join',多少到'交叉連接'。謝謝:) –

1

引回在MSSQL:

SELECT e.ManagerID, e.FirstName, e.LastName, COUNT(*) AS NumberOfDepartments FROM HumanResources.Employee e 
INNER JOIN Person.Contact c ON e.ContactID=c.ContactID 
GROUP BY e.ManagerID, e.FirstName, e.LastName 

如果您需要在MySQL中,變化到模式和INNER JOIN加盟