2011-04-17 59 views
2

需要您幫助GROUP BY子句。有關GROUP BY子句的幫助

我有兩個表:經理客戶(我簡化了它的問題)。

Managers: 
managerId int PK, 
ManagerName nvarchar(50) 

Clients: 
ClientId int, 
ClientName nvarchar(50), 
ManagerId int, WhenAdded datetime 

我存儲在經理表經理名單。客戶表中的每個客戶都有相應的管理員。

我想要一個SQL查詢將返回下表:

ManagerName nvarchar(50), 
NumberOfClients int 

我的問題是:如果 經理沒有一個客戶機。查詢結果中不包含ManagerName

我嘗試此查詢:

SELECT M.ManagerName, COUNT(*) 
FROM 
Clients AS C left join Managers AS M 
ON 
C.ManagerId = M.ManagerId 
GROUP BY 
M.ManagerName 

第二個問題

等同於第一個問題,但如果我想要一個where子句中的客戶端添加到WhenAdded場)。查詢必須返回ManagerNameNumberOfClients即使NumberOfClients=0

回答

1

您可以使用此:

SELECT ManagerName, (SELECT Count(ClientID) FROM Clients C WHERE 
    C.ManagerID=M.ManagerID) As NumberOfClients FROM Managers M; 

或本:

SELECT ManagerName, Count(C.ClientID) As NumberOfClients FROM Managers M 
    LEFT JOIN Clients C ON M.ManagerID=C.ManagerID GROUP BY M.ManagerID, 
    M.ManagerName; 

與您查詢的問題是,你正在使用的客戶端表爲基本表。

對於第二個問題,你可以使用這個:

SELECT ManagerName, (SELECT Count(ClientID) FROM Clients C WHERE 
    WhenAdded<DATEADD(day, 1, GETDATE()) AND M.ManagerID=C.ManagerID) As 
    NumberOfClients FROM Managers M; 
+0

第二個查詢解決了我的問題。謝謝。如果我想獲取具有相同列的表(ManagerId,NumberOfClients),如何添加having子句(使用WhenAdded)? – alexander 2011-04-17 09:00:54

0

這應該工作。雖然不是非常優化!

select m.ManagerName , count(c.ManagerId) from Managers m, Clients c where 
m.ManagerId = c.ManagerId group by c.ManagerId