【问题标题】:SSRS 2008 - Multiple Groupings For Date RangeSSRS 2008 - 日期范围的多个分组
【发布时间】:2013-02-21 13:39:44
【问题描述】:

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

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

谢谢你, 谢尔盖

【问题讨论】:

    标签: sql-server-2008-r2 ssrs-2008 reporting-services ssrs-grouping


    【解决方案1】:

    您也许可以使用自定义代码在 SSRS 中执行某些操作,但我建议您不要这样做。执行此操作的位置在数据集中。 SSRS不设计用于填写数据集中不存在的组。这听起来像你想要做什么:SSRS需要为每个日期创建组,无论是数据集是否在数据集中。

    如果您的数据库中没有数字或日期表,我只会在您提到您感兴趣的范围内的每个日期创建递归CTE。然后将其外部加入您的表并使用COUNT(tbl1.start_date) 查找合适的日期。这对于SQL Server来说,这不应该太痛苦。

    如果您真的需要避免CTE,那么我将创建一个日期或数字表以用于在您的范围内生成日期。

    【讨论】:

    • 递归 CTE 显然是一个痛苦的查询,仅仅几天的数据提取需要将近 20 秒,这在开发本报告的环境中是不可接受的。如果我只是提取日期范围的数据,则没有CTE,执行率为2秒。这就是为什么我试图在报表设计器中获得一种机制。
    • 这部分取决于您加入 CTE 的数据。尝试更换CTE使用TEMP表,看看是否更改了性能。如果是这样,那么SQL正在为CTE选择一个不好的计划,但TEMP表应该是一个精细的解决方法。此外,请确保您的表上有适当的索引。 span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2020-02-28
    • 2013-11-09
    • 2013-10-03
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多