Проблема: Мне необходимо создать отчет матрицы с использованием SQL Server Reporting Services (SSRS), который может показывать все месяцы в заголовке столбца, даже для месяцев, в которых отсутствуют данные.
Решение:
Для достижения этой цели мы можем изменить T-SQL запрос, используемый для разработки отчета SSRS. Исходный запрос возвращает сумму продаж для всех сотрудников за заданный год. Однако, если есть месяцы без данных, они не появляются в заголовках отчета матрицы.
Сначала нам нужно объявить таблицу переменных с именем @months и заполнить ее всеми номерами месяцев от 1 до 12 с помощью цикла:
DECLARE @months table (MonthNum int)
DECLARE @i int = 1
WHILE (@i <= 12)
BEGIN
INSERT INTO @months(MonthNum)
SELECT @i
SET @i = @i + 1
END
SELECT * FROM @months
После выполнения вышеуказанного кода у нас будет таблица переменных @months со всеми номерами месяцев.
Затем мы изменяем существующий T-SQL запрос, чтобы включить таблицу @months с использованием LEFT JOIN. Это гарантирует, что даже если основная таблица данных не содержит данных для нескольких месяцев, мы все равно получим все месяцы в выводе, а остальные столбцы будут иметь значения NULL:
DECLARE @months table (MonthNum int)
DECLARE @i int = 1
WHILE (@i <= 12)
BEGIN
INSERT INTO @months(MonthNum)
SELECT @i
SET @i = @i + 1
END
SELECT
b.FirstName + ' ' + b.LastName as EmployeeName
,[SalesAmountQuota]
,m.MonthNum as CalenderMonth
,MONTH([Date]) as CalenderMonth_old
,YEAR([Date]) as CalenderYear
FROM @months as m
LEFT JOIN [dbo].[FactSalesQuota] as a on m.MonthNum = MONTH(a.[Date]) and YEAR([Date]) = @Year
LEFT JOIN [dbo].[DimEmployee] as b on a.EmployeeKey = b.EmployeeKey
После обновления запроса набора данных отчета с помощью вышеуказанного кода мы можем обновить поля в отчете SSRS.
Наконец, мы можем внести некоторые корректировки форматирования отчета. Мы можем удалить пустые строки сотрудников, добавив выражение фильтрации в раздел группировки строк сотрудников в отчете SSRS:
ISNOTHING(Fields!EmployeeName.Value) = FALSE
Чтобы отображать 0 вместо пустых значений, мы можем использовать выражение IIF в текстовом поле значения:
=IIF(ISNOTHING(Sum(Fields!SalesAmountQuota.Value)), 0, Sum(Fields!SalesAmountQuota.Value))
После исправления этих элементов форматирования отчет будет отображать столбцы матрицы для всех месяцев, даже если данные отсутствуют.
Следуя этим шагам, вы можете создать отчет матрицы в SQL Server Reporting Services (SSRS), который показывает заголовки столбцов для всех месяцев, даже когда для этих столбцов нет данных.