Вам понадобится либо таблица календаря, либо вы можете сгенерировать ее с помощью CTE. Как только вы это сделаете, остальная часть запроса должна быть довольно тривиальной. Подход CTE может быть немного сложным из-за проблем рекурсии и невозможности использования агрегатов, поэтому ниже я использовал табличную переменную. Вы также можете сделать эту таблицу постоянной, которую храните в своей базе данных.
SET NOCOUNT ON
DECLARE @Calendar TABLE (my_date DATETIME NOT NULL)
DECLARE @date DATETIME, @max_date DATETIME
SELECT @date = MIN(StartDate), @max_date = MAX(EndDate) FROM My_Table
WHILE (@date <= @max_date)
BEGIN
INSERT INTO @Calendar (my_date) VALUES (@date)
SELECT @date = DATEADD(dy, 1, @date)
END
SELECT
C.myDate,
M.RequestType,
M.Area,
COUNT(*) AS myCount
FROM
@Calendar C
INNER JOIN My_Table M ON
M.StartDate <= C.myDate AND
M.EndDate >= C.myDate
GROUP BY
C.myDate,
M.RequestType,
M.Area
ORDER BY
C.myDate,
M.RequestType,
M.Area
В зависимости от того, насколько велик ваш потенциальный диапазон дат, заполнение табличной переменной может занять некоторое время. Например, если диапазон охватывает десятилетие или два.