Этот ответ может быть аналогичен ответу Михала Турчина, но есть несколько существенных отличий:
Не обращайте особого внимания на различия, создающие первые два CTE, так как разные они выглядят как неактуальные, просто материальностилей.
Важное различие заключается в третьем CTE и способе фильтрации вашего запроса. Имя вашего столбца (processstarttime) подсказывает, что это может быть очень большая таблица, поэтому, если вы используетегде предложения, использующие функции для выбранных столбцов таблицы, будут работать, но ваш запрос не будет проиндексирован, и производительность может стать дальнейшей проблемой
Не актуально, но также важно, чтобы он покрывал «ежемесячные данные».считать за прошлый год до текущего месяца "Требование заказа на поставку без жестких кодов, оно может быть в представлении или функции, которую не нужно изменять год за годом ...
WITH months AS (
SELECT 1 AS MonthNum, DATENAME(Month,DATEFROMPARTS(1,1,1)) AS MonthName
UNION ALL
SELECT MonthNum + 1, DATENAME(Month,DATEFROMPARTS(1, MonthNum + 1, 1)) AS MonthName
FROM months
WHERE MonthNum <= 11
),
years as (
SELECT YEAR(GETDATE())-1 AS Year
UNION ALL
SELECT Year + 1
FROM years
WHERE Year + 1 <= YEAR(GETDATE())
),
dates as (
SELECT Year, MonthNum, MonthName, DATEFROMPARTS(Year, MonthNum, 1) AS DateStart, DATEADD(MONTH, 1, DATEFROMPARTS(Year, MonthNum, 1)) AS DateEnd
FROM years
CROSS JOIN months
)
SELECT D.Year, D.MonthNum, D.MonthName, COUNT(ID) AS RequesCount
FROM dates D
LEFT JOIN YourTable A ON A.ProcessStartTime >= DateStart AND A.ProcessStartTime < DateEnd
WHERE DateStart < GETDATE()
GROUP BY D.Year, D.MonthNum, D.MonthName
ORDER BY Year, MonthNum