#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