Sql server 报告每个月的日期计数,仅给出StartDate和EndDate,而不是EventDate

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

在SSRS报告项目中,我需要提供过去12个月内机构检查结果的趋势数据。 与标准BI报告应用程序不同,标准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打开表格,每月给我一行,检查有效

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上阅读后,该示例运行良好,看起来比我自己的尝试更专业。谢谢