仅报告StartDate和EndDate而不是EventDate的每个月的日期计数

时间:2011-10-31 11:15:21

标签: sql-server reporting-services

在SSRS报告项目中,我需要提供过去12个月(滚动)企业检查趋势结果的数据。 与标准BI报告应用程序不同,可以在固定字段(例如“InspectionDate”)上进行分组,每次检查的结果在“StartDate”和“EndDate”之间有效。执行新检查时,该企业的先前记录将获得结束日期,并创建新记录,其中新的开始日期和结束日期为null。我需要报告汇总数据,了解每个月的状态。

目前,我为此生成数据的方法如下: -

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)UNPIVOT该表每个月给我一行检查有效

4)重新计算结果,以便给出每月总分数和平均分数

所以 - 这虽然有点笨重。 有没有更优雅和有效的方法来做到这一点,我还没有?

非常感谢

1 个答案:

答案 0 :(得分:2)

我会用几个目标清理它:

  • 只运行一个查询以返回所有数据。

  • 返回一个长表中的所有数据,而不是按月转动。让SSRS进行转动。

即。     来自QUERY的结果:

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中,您应该使用矩阵数据元素,而不是表格。列组将是Month Start,行组= InspectionID,并将SUM(ThingBeingMeasured)放入单元格中。