SSRS 2008中的分组 - 过滤

时间:2012-07-05 20:59:22

标签: ssrs-2008

我是SSRS的新手。我想按customerid对事务表进行分组,并计算每个customerid的事务数。我能够做到这一点。

但后来我想根据那个数进行排序,和/或按该计数过滤。那你怎么样?

谢谢!

2 个答案:

答案 0 :(得分:2)

要设置对行组的排序和过滤,请右键单击行组。

您可以在此处访问“组排序和过滤”属性。它们都应该允许您根据计数列的名称设置规则。

答案 1 :(得分:0)

选项1

如果您不需要在报告中显示事务,则应在查询中的数据库级别执行聚合,而不是通过SSRS执行聚合。你会得到以下好处:

  1. 渲染速度更快。
    • 您将通过网络发送更少的数据。
    • SSRS引擎处理的数据会更少,因此可以更快地执行任何排序。
  2. 您可以通过将最常见/期望的值放在基础查询的ORDER BY子句中来“预订”您的数据集。
    • 从而使任何渲染速度提升。
  3. 任何过滤器都可以直接应用于查询返回的聚合数据,而无需在SSRS中尝试复杂表达式。
    • 这也会在渲染时提升性能。
  4. 您可以使用“过滤器”参数,该参数可以在聚合查询的HAVING子句中使用
    • 同样,由于整个网络中的数据较少以及需要处理,性能也会提升。
    • 为报告提供一定程度的互动性,而不是尝试预先定义用户口味并在表达式上设置过滤条件或“最佳猜测”。
  5. 实施例

    -- Will filter out any customers who have 2 or fewer transactions
    DECLARE @Filter AS int = 2
    ;
    
    SELECT 
        CustomerId
        ,COUNT(TransactionId)
    
    FROM
        Transactions
    
    GROUP BY
        CustomerId
    
    HAVING
         COUNT(TransactionId) > @Filter
    

    选项2

    如果您仍需要显示交易,请在查询中添加其他列,使用Count()子句和OVER执行PARTITION BY customerid,如下所示:

    COUNT(transactions) OVER (PARTITION BY customerid) AS CustomerTransactionCount
    

    假设一个非常简单的表结构,你最终会得到一个像这样的查询结构:

    SELECT
        CustomerId
        ,TransactionId
        ,TransactionAttribute_1
        ,TransactionAttribute_2
        ,TransactionAttribute_3
        .
        .
        .
        ,TransactionAttribute_n
        ,COUNT(TransactionId) OVER (PARTITION BY CustomerId) AS CustomerTransactionCount
    
    FROM
        Transactions
    

    您可以在SSRS中的任何行/列组中使用CustomerTransactionCount作为过滤器和排序列。

    这种方法的缺点

    • 窗口函数,即使用OVER (PARTITION BY...)不能在HAVING子句中使用,因为不使用GROUP BY子句。这意味着任何过滤都必须由SSRS执行。

    解决方法选项

    1. 我们采取上面的查询并围绕它包装CTE。这将允许我们根据汇总结果进行过滤。
    2. 将聚合放在派生表中。
    3. CTE示例

      --Filter variable
      DECLARE @Filter AS int = 2
      ;
      
      WITH    DataSet_CTE AS
              (
                  -- Build the data set with transaction information and the aggregate column
                  SELECT
                      CustomerId
                      ,TransactionId
                      ,TransactionAttribute_1
                      ,TransactionAttribute_2
                      ,TransactionAttribute_3
                      .
                      .
                      .
                      ,TransactionAttribute_n
                      ,COUNT(TransactionId) OVER (PARTITION BY CustomerId) AS CustomerTransationCount
      
                  FROM
                      Transactions
              )
      
      -- Filter and return data       
      SELECT  *
      FROM    DataSet_CTE
      WHERE   CustomerTransationCount > @Filter
      

      派生表示例

      --Filter variable
      DECLARE @Filter AS int = 2
      ;
      
      SELECT
          *
      
      FROM
          (
              -- Build the data set with transaction information and the aggregate column
              SELECT
                  CustomerId
                  ,TransactionId
                  ,TransactionAttribute_1
                  ,TransactionAttribute_2
                  ,TransactionAttribute_3
                  .
                  .
                  .
                  ,TransactionAttribute_n
                  ,COUNT(TransactionId) OVER (PARTITION BY CustomerId) AS CustomerTransationCount
      
              FROM
                  Transactions
          ) AS DataSet
      
      WHERE
          DataSet.CustomerTransationCount > @Filter