在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)重新计算结果,以便给出每月总分数和平均分数
所以 - 这虽然有点笨重。 有没有更优雅和有效的方法来做到这一点,我还没有?
非常感谢
答案 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)放入单元格中。