2016-08-14 96 views
1

我有兩個表員工辦公室OfficeID是Employee表的外鍵。我需要找到每個辦公室的員工數量以及辦公室城市和員工名字等其他辦公室詳細信息。我寫了下面的查詢:無法獲得通過組工作

select o.OfficeID, o.City, o.State, o.Country, o.ZipCode, count(e.EmployeeID) 
from Office o 
inner join Employee e on o.OfficeID = e.OfficeID 
group by o.OfficeID 

在執行我得到以下信息 -

列「Office.City」在選擇列表中無效,因爲包含在聚合它不是 函數或GROUP BY子句。

我該如何正確使用group來解決這個問題?

感謝

回答

0
select o.OfficeID, o.City, o.State, o.Country, o.ZipCode, e.EmployeeID, e.FirstName, e.LastName , officeCnt.cnt 
from Employee e 
inner join (select OfficeId, count(*) as cnt from Employee group by OfficeId) as officeCnt 
     on e.OfficeID = officeCnt.OfficeID; 
inner join Office o on e.OfficeID = o.OfficeID 

你需要在一個子查詢,你可以通過

+0

由於應用組數。儘管我仍然需要弄清楚如何在子網格/表格中顯示僱員數據 – sm12

+0

那麼這是唯一按照您的要求顯示名稱和數量的查詢。 –

+0

我認爲;在不需要OfficeID之後 – sm12

1

你要麼需要包括在group byselect列表中的所有非聚合列:

select o.OfficeID, o.City, o.State, o.Country, o.ZipCode, 
     count(e.EmployeeID) 
from Office o inner join 
    Employee e 
    on o.OfficeID = e.OfficeID 
group by o.OfficeID, o.City, o.State, o.Country, o.ZipCode ; 

或者,分別聚集Employee。這裏有一個方法:

select o.*, e.cnt 
from Office o inner join 
    (select e.OfficeId, count(*) as cnt 
     from Employee e 
     group by e.OfficeId 
    ) e 
    on o.OfficeID = e.OfficeID; 

這種形式很方便,因爲你沒有外聚集,並可以包括你從selectOffice喜歡的任何列。

另一種方法使用cross apply

select o.*, e.cnt 
from Office o inner join 
    (select count(*) as cnt 
     from Employee e 
     where o.OfficeID = e.OfficeID 
    ) e; 

這有點短。