Published on

February 17, 2020

Создание отчета матрицы с отсутствующими данными в SQL Server Reporting Services (SSRS)

Проблема: Мне необходимо создать отчет матрицы с использованием 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), который показывает заголовки столбцов для всех месяцев, даже когда для этих столбцов нет данных.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.