У меня есть следующий SQL запрос:
SELECT
[Manager].[Name],
SUM(CASE
WHEN [Project].[CurrentStatusDt] >= CAST(CAST(YEAR(GETDATE()) - 2 AS CHAR) AS DATE) AND [Project].[CurrentStatusDt] < CAST(CAST(YEAR(GETDATE()) - 1 AS CHAR) AS DATE)
THEN 1
ELSE 0
END) AS TotalProjectsCY2,
SUM(CASE
WHEN [Project].[CurrentStatusDt] >= CAST(CAST(YEAR(GETDATE()) - 1 AS CHAR) AS DATE) AND [Project].[CurrentStatusDt] < CAST(CAST(YEAR(GETDATE()) AS CHAR) AS DATE)
THEN 1
ELSE 0
END) AS TotalProjectsCY1,
SUM(CASE
WHEN [Project].[CurrentStatusDt] >= CAST(CAST(YEAR(GETDATE()) AS CHAR) AS DATE)
THEN 1
ELSE 0
END) AS TotalProjectsCY,
SUM([Project].[CurrentStatusId]) AS TotalProjects
FROM [Project]
INNER JOIN [Manager] ON [Project].[ManagerId] = [Manager].[ManagerId]
WHERE
[Project].[CurrentStatusId] = 5
GROUP BY [Manager].[Name]
Цель этого состоит в том, чтобы в основном динамически возвращать проекты, выполненные менеджером по годам. Проблема, с которой я сталкиваюсь, заключается в том, что итоговые суммы суммируются намного выше, чем я ожидаю.
Я выполнил следующий запрос SQL, чтобы получить итоговую сумму по всем проектам (для сравнения с итоговой суммой из приведенного выше). запрос):
SELECT
[Manager].[Name],
COUNT([Project].[CurrentStatusId]) AS Total
FROM [Project]
INNER JOIN [Manager] ON [Project].[ManagerId] = [Manager].[ManagerId]
WHERE
[Project].[CurrentStatusId] = 5 AND [Manager].Name = 'MGR_NAME'
GROUP BY [Manager].[Name]
Общая сумма, полученная по первому запросу, составила MGR_NAME 62 10 0 5035
Общая сумма, полученная по второму запросу, составила MGR_NAME 1007
Конечно, первое Результаты запроса отличаются от второго, так как по годам разбиения нет. Ключевое отличие состоит в том, что сломанный запрос (первый) возвращает 5035 как мой итог, а второй запрос возвращает правильную сумму 1007 .
ОБНОВЛЕНИЕ
Поэтому я исправил проблему COUNT () и SUM (). Новый запрос:
SELECT
[Manager].[Name],
COUNT(CASE
WHEN [Project].[CurrentStatusDt] >= CAST(CAST(YEAR(GETDATE()) - 2 AS CHAR) AS DATE) AND [Project].[CurrentStatusDt] < CAST(CAST(YEAR(GETDATE()) - 1 AS CHAR) AS DATE)
THEN 1
ELSE 0
END) AS TotalProjectsCY2,
COUNT(CASE
WHEN [Project].[CurrentStatusDt] >= CAST(CAST(YEAR(GETDATE()) - 1 AS CHAR) AS DATE) AND [Project].[CurrentStatusDt] < CAST(CAST(YEAR(GETDATE()) AS CHAR) AS DATE)
THEN 1
ELSE 0
END) AS TotalProjectsCY1,
COUNT(CASE
WHEN [Project].[CurrentStatusDt] >= CAST(CAST(YEAR(GETDATE()) AS CHAR) AS DATE)
THEN 1
ELSE 0
END) AS TotalProjectsCY,
COUNT([Project].[CurrentStatusId]) AS TotalProjects
FROM [Project]
INNER JOIN [Manager] ON [Project].[ManagerId] = [Manager].[ManagerId]
WHERE
[Project].[CurrentStatusId] = 5
GROUP BY [Manager].[Name]
Моя новая проблема - он все еще не возвращает то, что должен. Я снова использовал тот же тестовый запрос (с другим менеджером) (смотрите выше). Вот что выдает новый запрос и тестовый запрос:
Новый запрос: MGR_NAME 1 1 1 1
Тестовый запрос: MGR_NAME 5
Та же проблема, что и раньше, запрос должен возвращать 5 против того, что он фактически возвращает 1 как общее
ОБНОВЛЕНИЕ
Если я удаляю ELSE 0
в операторах CASE
, я получаю следующие данные вернулся: MGR_NAME 0 0 0 1
. Это изменило итоги за последние три года с 1 на 0.