2011-04-17 61 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