3

表中的记录包含一系列有效日期,例如: * tbl1.start_date *和* tbl1.end_date *。因此,为了确保我获得对特定日期范围有效的所有记录,选择逻辑为:<...> WHERE end_date >= @dtFrom AND start_date < @dtTo(在SQL语句中使用的@dtTo参数实际上是计算的第二天在* @ prmDt_To *参数中使用的报告)。SSRS 2008 - 多个分组日期范围

现在在报告中,我需要计算指定数据范围内每一天的记录数,并包括没有有效记录的天数(如果有的话)。因此,检索到的记录可能在几个不同的日子里被计算。我可以用数据集中的递归CTE相对容易地做到这一点,但我的经验法则是避免SQL数据库中不必要的负载,而只返回必要的原始数据并让Report引擎处理分组。那么在SSRS中有没有办法做到这一点?

谢谢 谢尔盖

回答

1

你也许可以做到在SSRS与自定义代码的东西,但我建议反对。要做到这一点的地方在数据集中。 SSRS不是用来填充数据集中不存在的组。这听起来像你正在做的事情:无论日期是否在数据集中,SSRS都需要为每个日期创建组。

如果您的数据库中没有数字或日期表,那么我只需创建一个递归CTE,并在您感兴趣的范围内记录每个日期的记录。然后外面加入这个到你的表,并使用COUNT(tbl1.start_date)找到适当的日子。这对SQL服务器的查询应该不会太痛苦。

如果您确实需要避免CTE,那么我会创建一个日期或数字表以用于生成范围中的日期。

+0

显然,递归CTE是一个痛苦的查询,仅仅几天的数据提取花费了将近20秒,这在开发此报告的环境中是不可接受的。如果我只提取日期范围的数据,而没有CTE,则执行时间不到2秒。这就是为什么我想要在报表设计器中使用它的机制。 – krysolov 2013-03-06 22:07:06

+0

这部分将取决于您加入CTE的数据。尝试用临时表替换CTE以查看是否改变了性能。如果是这样,那么SQL为CTE选择了一个坏计划,但临时表应该是一个很好的解决方法。 另外,请确保您的表格上有适当的索引。 – 2013-03-07 00:56:06