Отчетность по количеству дат за каждый месяц с указанием только StartDate и EndDate, а не EventDate - PullRequest
1 голос
/ 31 октября 2011

В проекте отчетности по SSRS мне нужны данные о результатах проверок предприятий за последние 12 месяцев (скользящие).В отличие от стандартного приложения для составления отчетов BI, в котором группировка может выполняться по фиксированному полю, например «InspectionDate», результаты каждой проверки действительны между «StartDate» и «EndDate».Когда выполняется новая проверка, предыдущая запись для этого предприятия получает конечную дату, и создается новая запись с новой начальной датой и нулевой конечной датой.Мне нужно сообщать агрегированные данные для статуса, который был бы для каждого месяца.

Поэтому в настоящее время я использую подход для получения данных для этого: -

1)Реплицируйте текущие данные на сервер отчетов и добавьте 12 новых полей от P0 до P11, чтобы указать, какие месяцы действительна в течение предыдущих 12 месяцев.

2) Запустите 12 запросов на обновление в следующей форме ...

UPDATE tblDistributionReports
SET P1 = 1
WHERE DATEDIFF(MONTH,GETDATE(),StartDate) <= -1  
AND (ENDDATE IS NULL OR DATEDIFF(MONTH,GETDATE(),EndDate) >= -1 )
Etc .....

3) ОТКЛЮЧИТЕ таблицу, чтобы дать мне по одной строке за каждый месяц, когда проверка была действительной

4) Повторно СДЕЛАТЬ результаты, чтобы получить агрегированные подсчеты и средние оценки за каждый месяц

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

Большое спасибо

1 Ответ

2 голосов
/ 31 октября 2011

Я бы исправил это с помощью пары целей:

  • Выполнить всего один запрос, чтобы вернуть все данные.

  • Вернуть вседанные в одной длинной таблице, а не по месяцам.Пусть 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) в ячейках.

...