帮助GROUP BY子句

时间:2011-04-17 08:31:12

标签: tsql sql-server-2008

需要您对GROUP BY条款的帮助。

我有两个表:经理客户(我简化了一个问题)。

Managers:
managerId int PK,
ManagerName nvarchar(50)

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

我将经理列表存储在Managers表中。 Clients表中的每个客户端都有一个相应的管理器。

我想要一个返回以下表的SQL查询:

ManagerName nvarchar(50),
NumberOfClients int

我的问题是: 如果经理没有客户。 Sql查询在结果表中不包含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子句。即使ManagerName,查询也必须返回NumberOfClientsNumberOfClients=0

2 个答案:

答案 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;

您的查询存在的问题是您使用Clients表作为基本表。

对于第二个问题,你可以使用它:

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

答案 1 :(得分:0)

这应该有效。虽然不是很优化!

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