Я бы подошел к этому с помощью матрицы и соответственно установил фон каждой ячейки.
Для этого нам понадобится набор дат для работы.В вашем случае, поскольку вы, похоже, переходите только на уровень месяца, моя таблица дат содержит только месяцы и годы.
Для начала создайте новый отчет и добавьте набор данных со следующим запросом.Вам, очевидно, придется настроить это в соответствии с вашей базой данных, но вы должны понять.Вскоре я объясню код.
DECLARE @dates TABLE(Year int, Month int)
INSERT INTO @dates VALUES
(2018,1), (2018,2), (2018,3), (2018,4), (2018,5), (2018,6),
(2018,7), (2018,8), (2018,9), (2018,10), (2018,11), (2018,12),
(2019,1), (2019,2), (2019,3), (2019,4)
DECLARE @t TABLE (GroupName varchar(10), ActivityName varchar(10), StartDate date, EndDate date, RGB varchar(10))
INSERT INTO @t VALUES
('Group 1', 'Activity 1', '2018-01-03', '2018-12-14', '#ED7D31'),
('Group 1', 'Activity 2', '2018-02-03', '2018-06-14', '#AFABAA'),
('Group 2', 'Activity 3', '2018-01-03', '2018-04-14', '#9DC3E8'),
('Group 2', 'Activity 4', '2018-06-03', '2018-07-14', '#2E75B5'),
('Group 2', 'Activity 5', '2018-08-03', '2018-12-14', '#C55B11'),
('Group 2', 'Activity 6', '2018-03-03', '2018-07-14', '#F4B184'),
('Group 3', 'Activity 7', '2018-10-03', '2019-03-14', '#596DF2'),
('Group 3', 'Activity 8', '2009-01-03', '2019-02-14', '#3d7080')
SELECT *
FROM @dates d
LEFT JOIN (
SELECT
*
, (Year(StartDate) * 100) + Month(StartDate) as StartYrMn
, (Year(EndDate) * 100) + Month(EndDate) as EndYrMn
FROM @t
) a
ON ((d.[Year] * 100) + d.[Month]) BETWEEN StartYrMn AND EndYrMn
ORDER BY ActivityName, d.Year, d.Month
Эта первая часть - наша таблица дат.Я только что создал это в наборе данных, но вы, вероятно, хотите иметь постоянную таблицу базы данных для этого.
Вторая часть воссоздает ваши образцы данных, я расширил их до межгодовых границ (естьгде-то наступает 2019 год), поэтому он все еще будет работать, если данные не попадают в течение одного года.Я также добавил столбец RGB для хранения нужных нам цветов (есть другие способы сделать это, но это самый простой способ)
Последний оператор SELECT берет основные данные о деятельности, вычисляет столбцы StartYrMn и EndYrMn, которые простоудерживайте такие значения, как, например, 201812
для декабря 2018 года.Это делается в подзапросе
Затем мы берем нашу таблицу дат и LEFT JOIN
в наш подзапрос, чтобы создать набор данных, который содержит 1 строку для каждого года / месяца и действия.Вы можете запустить приведенный выше код в SSMS, чтобы увидеть результаты.
ОК, все на стороне данных сделано ...
Затем добавьте элемент Matrix в свой отчет.
Установите группы строк для GroupName и ActivityName (GroupName требуется родительский объект для ActivityName).
Теперь добавьте группы столбцов для [Year] и [Month].Опять же, [Год] должен быть родителем для [Месяц]
Дизайн отчета должен выглядеть примерно так (за исключением выражения месяца, которое я рассмотрю далее.

Если вы запустите отчет сейчас, вы получите номера месяцев в заголовках столбцов, чтобы исправить это, измените выражение месяца на
=FORMAT(DATESERIAL(2017, Fields!Month.Value, 1), "MMM")
. Вы можете игнорировать 2017 год, мыпросто нужно создать дату, чтобы получить название месяца. Вы могли бы использовать 1999, он все еще будет работать.
Теперь все, что осталось сделать, это покрасить фон ячеек. Установите цвет фона Data
в следующем выражении.
=IIF(IsNothing(Fields!ActivityName.Value), nothing, Fields!RGB.Value)
Все, что мы здесь делаем, это говорим, что если данных нет, оставьте пустую ячейку, иначе установите цвет в значение RGB из нашего набора данных.
Вот и все!
Ваш конечный результат должен выглядеть примерно так ...

Если вы не можете получитьэто работает. Я предлагаю вам начать с точных шагов выше, используя набор данных, который я прови затем медленно вносите изменения, чтобы соответствовать вашей базе данных.