Есть ли способ разделить sql результатов по годам? - PullRequest
0 голосов
/ 09 января 2020

В настоящее время у меня есть следующий оператор SQL:

SELECT
    [Manager].[Name], 
    COUNT([Project].[ProjectId]) AS TotalProjects
FROM 
    ([Project]
INNER JOIN 
    [Manager] ON [Project].[ManagerId] = [Manager].[ManagerId])
WHERE 
    [Project].[CurrentStatusId] = 5
GROUP BY 
    [Manager].[Name]

В настоящее время каждый руководитель распределяет общее количество проектов. Я бы хотел, чтобы он разбил проекты по годам их завершения. Поэтому в основном подсчитайте общее количество проектов для каждого менеджера за каждый год (2016, 2017 и т. Д.), А также общее количество проектов за все время. Я могу использовать столбец [Project].[CurrentStatusDt] для даты.

1 Ответ

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

Просто добавьте год проекта к пунктам SELECT и GROUP BY:

SELECT
    [Manager].[Name], 
    YEAR([Project].[CurrentStatusDt]) PojectYear,
    COUNT([Project].[ProjectId]) AS TotalProjects
FROM [Project]
INNER JOIN [Manager] ON [Project].[ManagerId] = [Manager].[ManagerId]
WHERE [Project].[CurrentStatusId] = 5
GROUP BY [Manager].[Name], YEAR([Project].[CurrentStatusDt])

Примечание: вам не нужны скобки вокруг объединений на SQL Сервере (это MS Ограничение доступа).


EDIT

Если вы хотите распределить годы по столбцам, а не по строкам, тогда одним из решений является использование условной агрегации

SELECT
    [Manager].[Name], 
    SUM(CASE 
        WHEN [Project].[CurrentStatusDt] < CAST('2019-01-01' AS DATE)
        THEN 1 
        ELSE 0 
    END) TotalProjects2018,
    SUM(CASE 
        WHEN [Project].[CurrentStatusDt] >= CAST('2019-01-01' AS DATE)
        THEN 1 
        ELSE 0 
    END) TotalProjects2019
FROM [Project]
INNER JOIN [Manager] ON [Project].[ManagerId] = [Manager].[ManagerId]
WHERE 
    [Project].[CurrentStatusId] = 5 
    AND [Project].[CurrentStatusDt] >= CAST('2018-01-01' AS DATE)
    AND [Project].[CurrentStatusDt] <  CAST('2020-01-01' AS DATE)
GROUP BY [Manager].[Name]
...