2015-06-27 52 views
0

我想在MS SQL Server中編寫一個propper SQL查詢。首先,我有以下表格:城鎮,僱員,地址。幾乎每個員工都有經理,而ManagerID也是員工的外鍵。 (自我關係)。我的目標是顯示每個城鎮的經理人數。到目前爲止,我有這樣的代碼:在SQL查詢中使用GROUP BY的問題

SELECT t.Name, COUNT(*) AS [Managers from each town] 
FROM Towns t 
JOIN Addresses a 
ON t.TownID = a.TownID 
JOIN Employees e 
ON a.AddressID = e.AddressID 
GROUP BY t.Name 
ORDER BY [Managers from each town] DESC 

此查詢返回每個城鎮,而不是經理的僱員人數。 如果我嘗試第二次查詢波紋管,我得到完全錯誤的東西:

SELECT t.Name, COUNT(*) AS [Managers from each town] 
FROM Towns t 
JOIN Addresses a 
ON t.TownID = a.TownID 
JOIN Employees e 
ON a.AddressID = e.AddressID 
JOIN Employees m 
ON e.ManagerID = m.ManagerID 

GROUP BY t.Name 
ORDER BY [Managers from each town] DESC 

這裏是「員工」表的結構:

僱員,名字,姓氏,中間名,JOBTITLE,DepartamentID,經理ID,僱傭日期,工資,AddressID

正確的查詢必須返回這個結果集:如果我理解你的結構共同

Town   | Managers from each town 
Issaquah  | 3 
Kenmore  | 5 
Monroe  | 2 
Newport Hills | 1 
+0

採樣數據將是非常有益的,正如一個SQL小提琴。 –

回答

0

我認爲以下變化的原來的查詢應能誰駐留在每個城市的管理者:

SELECT t.Name, COUNT(DISTINCT e.EmployeeId) AS [Managers from each town] 
FROM Towns t JOIN 
     Addresses a 
     ON t.TownID = a.TownID JOIN 
     Employees e 
     ON a.AddressID = e.AddressID 
WHERE e.EmployeeId IN (SELECT e2.ManagerId FROM Employees e2) 
GROUP BY t.Name 
ORDER BY [Managers from each town] DESC; 

DISTINCT可能不是必要的,但它是很難說withou更好地理解數據結構。

+0

使用此過濾器 WHERE e.EmployeeId IN(SELECT e2.ManagerId FROM Employees e2) 我得到正確的結果。也許再次添加所有employess到自己不是一個正確的決定。像這裏: JOIN Employees e ON a.AddressID = e.AddressID JOIN Employees m ON e.ManagerID = m.ManagerID 非常感謝! – FarCry88

1

正確地說,員工是經理的唯一跡象是,其ID是否被用作其他員工的經理。第一個查詢已正確顯示數,則所有需要的是過濾的東西,結果就像因此

where EmployeeID in (select ManagerID from Employees) 

把你的第一個查詢到:

SELECT t.Name, COUNT(*) AS [Managers from each town] FROM Towns t 
JOIN Addresses a 
ON t.TownID = a.TownID 
JOIN Employees e 
ON a.AddressID = e.AddressID 
where EmployeeID in (select ManagerID from Employees) 
GROUP BY t.Name 
ORDER BY [Managers from each town] DESC 
+0

您的回答幫助我改進了我的SQL代碼,謝謝 – FarCry88

0

嘗試:

select t.name, 
     count(*) as num_managers 
    from employees m 
    join addresses a 
    on m.addressid = a.addressid 
    join towns t 
    on a.townid = t.townid 
where exists (select 1 from employees x where x.managerid = m.employeeid) 
group by t.name 
order by 2 desc 
0

你可以試試下面的查詢來獲得您所需的輸出...

select t.TownName, COUNT(*) as No from Town t 
Inner Join Address a on a.TownID = t.TownID 
inner join Employee e on e.ManagerID = a.EmployeeID 
Group By t.TownName