Это не так просто, как вы, наверное, ожидаете. В основном это связано с несколькими вопросами, связанными с вашим вопросом:
- Ваша структура таблицы неизвестна (в следующий раз добавьте DDL).
- Мы должны предположить, что ваши даты хранятся в виде
VARCHAR
из-за формат YYYYMM.
- Производить последовательность дат легче всего достигается с помощью таблицы «Даты», мы должны предположить, что вы не один.
Это, как говорится, следующий запрос будет производить результаты, которые вы стремитесь, учитывая мое понимание правильно:
;
WITH CTE_DateTable
AS (
SELECT #t.ID,
CAST(#t.StartDate_YYYYMM + '01' AS DATE) AS StartDate,
CAST(#t.EndDate_YYYYMM + '01' AS DATE) AS EndDate
FROM #t
),
CTE_MinMaxDates
AS (
SELECT MIN(CTE_DateTable.StartDate) AS MinDate,
MAX(CTE_DateTable.EndDate) AS MaxDate,
DATEDIFF(MONTH, MIN(CTE_DateTable.StartDate), MAX(CTE_DateTable.EndDate)) AS Difference
FROM CTE_DateTable
),
CTE_Nums
AS (
SELECT ROW_NUMBER() OVER (ORDER BY ob.object_id) AS Num
FROM sys.all_objects AS ob
),
CTE_Months
AS (
SELECT DATEADD(MONTH, n.Num - 1, d.MinDate) AS MonthStart
FROM CTE_MinMaxDates d
CROSS JOIN CTE_Nums n
WHERE DATEADD(MONTH, n.Num - 1, d.MinDate) <= d.MaxDate
)
SELECT CAST(DATEPART(YEAR, m.MonthStart) AS VARCHAR) + SUBSTRING(CONVERT(NVARCHAR(6), m.MonthStart, 112), 5, 2) AS StartDate_YYYYMM,
COUNT(DISTINCT d.ID) AS Count
FROM CTE_DateTable AS d
INNER JOIN CTE_Months AS m ON m.MonthStart BETWEEN d.StartDate AND d.EndDate
GROUP BY m.MonthStart;
Working example