Почему я получаю больше данных, чем предполагалось? - PullRequest
0 голосов
/ 09 января 2020

У меня есть следующий 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.

1 Ответ

1 голос
/ 09 января 2020

Вы должны использовать COUNT (Project.CurrentStatusId) вместо SUM, чтобы получить общее количество проектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...