Помогите с трудной оговоркой 'group by' - PullRequest
1 голос
/ 22 мая 2011

нужна ваша помощь с запросом.

У меня есть таблица Managers (ManagerId, ManagerName)

У меня есть таблица Statuses (StatusId, StatusName) (в этой таблице около 10 статусов)

У меня есть таблица Clients (ClientId, ClientName, ManagerId, StatusId, WhenAdded) (WhenAdded - это тип даты и времени)

Очевидно, что поле 'ManagerId' относится к таблице 'Managers', а поле 'StatusId' относится к таблице 'Statuses'.

Пользователь хочет получить статистику о менеджерах за период времени (from startDate to endDate using field 'WhenAdded') в следующей таблице.

Столбцы:

ManagerName, NumberOfClients, NumberOfClientsWithStatus1, NumberOfClientsWithStatus2, NumberOfClientsWithStatus3 и т. Д.

Количество столбцов с именем NumberOfClientsWithStatusI, где i - это количество состояний, равное количеству строк в таблице 'Statuses'.

Как это сделать?

t-sql, sql server 2008 r2 express edition.

Ответы [ 2 ]

1 голос
/ 22 мая 2011
SELECT
    ManagerName,
    COUNT(*) AS NumberOfClients,
    COUNT(CASE WHEN S.StatusId = 1 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus1,
    COUNT(CASE WHEN S.StatusId = 2 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus2,
    COUNT(CASE WHEN S.StatusId = 3 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus3,
    ...
FROM
   Clients C
   JOIN
   Managers M ON C.ManagerId = M.ManagerId
   JOIN
   Statuses S ON C.StatusId = S.StatusId
WHERE
    M.WhenAdded BETWEEN @startDate AND @endDate
GROUP BY
    M.ManagerName

Примечание: не существует чистого способа добавить произвольные номера столбцов состояния в SQL (не только в SQL Server), поскольку это фиксированный вывод столбца. Вам придется изменить запрос статуса, если вы не решите это в клиенте

Редактировать, после комментария

SELECT
    ManagerName,
    COUNT(*) AS NumberOfClients,
    COUNT(CASE WHEN S.StatusId = 1 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus1,
    COUNT(CASE WHEN S.StatusId = 2 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus2,
    COUNT(CASE WHEN S.StatusId = 3 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus3,
    ...
FROM
   Managers M ON C.ManagerId = M.ManagerId
   LEFT JOIN
   Clients C
   LEFT JOIN
   Statuses S ON C.StatusId = S.StatusId
WHERE
    M.WhenAdded BETWEEN @startDate AND @endDate
GROUP BY
    M.ManagerName
0 голосов
/ 22 мая 2011

Если вы знаете, что таблица statuses всегда будет содержать ограниченное количество статусов, вы можете сделать это:

SELECT M.ManagerName,
       COUNT(C.ClientId) NumberOfClients,
       SUM(CASE WHEN S.StatusId= 1 THEN 1 ELSE 0 END) NumberOfClientsWithStatus1,
       SUM(CASE WHEN S.StatusId= 2 THEN 1 ELSE 0 END) NumberOfClientsWithStatus2,
       ...
  FROM Clients C
  JOIN Managers M on M.ManagerId = C.ManagerId
  JOIN Statuses S on S.StatusId = C.StatusId
 WHERE C.WhenAdded BETWEEN startDate AND endDate 
 GROUP BY ManagerName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...