Sql server 报告每个月的日期计数,仅给出StartDate和EndDate,而不是EventDate
在SSRS报告项目中,我需要提供过去12个月内机构检查结果的趋势数据。 与标准BI报告应用程序不同,标准BI报告应用程序可以在固定字段(如“InspectionDate”)上进行分组,每次检查的结果在“StartDate”和“EndDate”之间有效。执行新检查时,该机构的上一条记录将获得结束日期,并创建一条新记录,新的开始日期和结束日期为null。我需要报告每个月的聚合数据状态 因此,目前,我正在采取以下方法来生成这方面的数据:- 1将实时数据复制到报表服务器,并将12个新字段P0添加到P11,以标记记录在过去12个月内的有效月份 2以以下形式运行12个更新查询Sql server 报告每个月的日期计数,仅给出StartDate和EndDate,而不是EventDate,sql-server,reporting-services,Sql Server,Reporting Services,在SSRS报告项目中,我需要提供过去12个月内机构检查结果的趋势数据。 与标准BI报告应用程序不同,标准BI报告应用程序可以在固定字段(如“InspectionDate”)上进行分组,每次检查的结果在“StartDate”和“EndDate”之间有效。执行新检查时,该机构的上一条记录将获得结束日期,并创建一条新记录,新的开始日期和结束日期为null。我需要报告每个月的聚合数据状态 因此,目前,我正在采取以下方法来生成这方面的数据:- 1将实时数据复制到报表服务器,并将12个新字段P0添加到P11
UPDATE tblDistributionReports
SET P1 = 1
WHERE DATEDIFF(MONTH,GETDATE(),StartDate) <= -1
AND (ENDDATE IS NULL OR DATEDIFF(MONTH,GETDATE(),EndDate) >= -1 )
Etc .....
3打开表格,每月给我一行,检查有效
4重新调整结果,给我每个月的汇总计数和平均分数
因此,尽管这有点笨重,但它仍然有效。
有没有比这更优雅、更有效的方法,我还没有想到
非常感谢我想通过以下几个目标来解决这个问题: 只运行一个查询以返回所有数据 返回一个长表中的所有数据,不按月份进行数据透视。让SSR做旋转 即。 查询结果:
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,并将SUMThingBeingMeasured放入单元格。在检查上述内容并在CTE上阅读后,该示例运行良好,看起来比我自己的尝试更专业。谢谢