1

我是 SSRS 的新手。我想按 customerid 对交易表进行分组,并计算每个 customerid 有多少交易。我能够做到这一点。

但是我想按那个计数排序,和/或按那个计数过滤。你是怎么做到的?

谢谢!

4

2 回答 2

2

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

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

于 2012-08-23T20:23:49.013 回答
0

选项1

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

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

例子

-- 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()usingOVER子句 and 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

您将能够CustomerTransactionCount在 SSRS 中的任何行/列组中用作过滤器和排序列。

这种方法的缺点

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

解决方法选项

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

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
于 2012-10-31T04:08:26.063 回答