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