Справка с предложением GROUP BY

#tsql #sql-server-2008

#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 поле в Clients). Запрос должен возвращать ManagerName и NumberOfClients даже если 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;
  

Проблема с вашим запросом заключается в том, что вы используете таблицу 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. Второй запрос решает мою проблему. Спасибо. Как мне добавить предложение having (используя WhenAdded), если я хочу получить таблицу с одинаковыми столбцами (ManagerID, NumberOfClients)?

Ответ №2:

Это должно сработать. Хотя и не очень оптимизировано!

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