在SSRS中生成一个月中的所有日子

时间:2011-10-03 17:10:25

标签: reporting-services

我正在设计一个报告,我需要在一个月内显示所有日期(例如:4月份的1到30日)并显示与之相关的信息。但是我的报告仅显示与其关联的数据的日期,并忽略所有其他日期。无论数据如何,有没有办法显示报告中的所有日期?

2 个答案:

答案 0 :(得分:2)

正如Wil在他的评论中暗示的那样,在数据集/查询中生成这些天是最容易的。这是使用CTE(通用表格表达)的理想场所。这些生成了一个可以在查询中使用的表,它们支持递归,因此很容易生成一个包含任意天数的表。

谷歌“一个月内的cte天”给了我这个链接作为最佳结果之一:http://smehrozalam.wordpress.com/2009/06/09/t-sql-using-common-table-expressions-cte-to-generate-sequences/

如果没有意义,请发表评论。

好的,这是一个使用CTE的样本,当月有几天。

WITH  DaysOfMonthCTE
        AS ( SELECT  DATEADD(month, DATEDIFF(MONTH, 0, GETDATE()), 0) AS StartDate ,
                     DATEADD(month, DATEDIFF(MONTH, 0, GETDATE()), 1) AS EndDate
             UNION ALL
             SELECT  DATEADD(day, 1, StartDate) ,
                     DATEADD(DAY, 1, EndDate)
             FROM    DaysOfMonthCTE
             WHERE   EndDate < DATEADD(month,
                                       DATEDIFF(MONTH, 0, GETDATE()) + 1, 0)
           )
   SELECT   Student.Name ,
            DaysOfMonthCTE.StartDate ,
            AVG(Scores.TestScore) AS AverageScore
   FROM     myStudentsTable AS student
   INNER JOIN myScoresTable scores
            ON student.ID = scores.StudentID
   RIGHT OUTER JOIN DaysOfMonthCTE
            ON scores.TestDate >= DaysOfMonthCTE.StartDate
               AND scores.TestDate < DaysOfMonthCTE.EndDate
   GROUP BY Student.NAME ,
            DaysOfMonthCTE.StartDate

答案 1 :(得分:0)

@JamieF的答案是现货,但我正在寻找一个更通用的日期生成器,我可以在其中获得开始日期和结束日期之间的日期列表。 OP要求在一个月内的所有日子,所以这个答案不是OP的真正答案。我在这里添加了一个人(像我一样)正在寻找如何在SSRS中动态生成序列数据。

我只是在数据集中添加以下内容作为查询的基础,并使用了两个参数 - @StartDate和@EndDate。

;with  DateGenerator
as (
select
    CONVERT(datetime, @StartDate) GeneratedDate 
union all select
    DATEADD(day, 1, GeneratedDate)
from
    DateGenerator
where GeneratedDate < @EndDate
)
select
    GeneratedDate
from
    DateGenerator

option (maxrecursion 32767)

小心 - 限制范围为32767天。如果范围大于该范围,则此解决方案将崩溃​​。

要使用,只需将查询加入可伪造的DateGenerator(上面的行&#39;选项&#39;语句)