Я бы исправил это с помощью пары целей:
Выполнить всего один запрос, чтобы вернуть все данные.
Вернуть вседанные в одной длинной таблице, а не по месяцам.Пусть SSRS выполнит поворот.
РЕЗУЛЬТАТЫ IE ИЗ ЗАПРОСА:
MonthStart MonthEnd InspectionID ThingBeingMeasured
Jan 1, 2011 Feb 1, 2011 1 14
Feb 1, 2011 March 1, 2011 1 14
March 1, 2011 April 1, 2011 1 14
March 1, 2011 April 1, 2011 2 9
April 1, 2011 May 1, 2011 2 9
Приведенный ниже запрос должен дать вам подходящую основу для стороны запроса:
;
WITH MonthsCTE AS (
SELECT
DATEADD(
year,
-1,
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0))
as MonthStart,
DATEADD(
year,
-1,
DATEADD(month, DATEDIFF(month, 0, GETDATE()) +1, 0))
as MonthEnd
UNION ALL
SELECT
DATEADD(Month, 1, MonthStart),
DATEADD(MONTH, 1, MonthEnd)
FROM
MonthsCTE
WHERE MonthEnd < GETDATE())
SELECT
MonthsCTE.MonthStart,
MonthsCTE.MonthEnd,
InspectionID,
SUM(NumberOfViolations) AS SumOfViolations
FROM Inspections
INNER JOIN
MonthsCTE
ON COALESCE(Inspections.EndDate, GETDATE() ) >= MonthsCTE.MonthStart
AND Inspections.StartDate < MonthsCTE.MonthEnd
GROUP BY
MonthsCTE.MonthStart,
MonthsCTE.MonthEnd,
InspectionID
Сначала я создаю CTE с датами начала и окончания месяца за прошлый год.Затем я присоединяю это к таблице проверок, но в условии для объединения я использую соответствующие операторы неравенства для объединения одной строки проверки с несколькими строками в таблице месяцев.
Затем в SSRS следует использоватьэлемент данных матрицы, а не таблица.Группой столбцов будет «Начало месяца», группа строк = InspectionID и место SUM (ThingBeingMeasured) в ячейках.