【问题标题】:Display Top n Values in SSRS based on Parameter value根据参数值显示 SSRS 中的前 n 个值
【发布时间】:2015-09-23 15:37:54
【问题描述】:

所以我在 SSRS 中有一个包含三列的简单表。第一个是代理(调用处理程序的名称),第二个由一个参数填充,该参数控制 6 个可能的列中的哪一个显示数据。构成数据集的查询如下;

SELECT CAST(Day AS DATE) AS 'Day'
, ISNULL(externalID, '**No Agent**') AS 'Agent'
, CAST((TalkTime + BreakTime + BusyonDNTime + BusyMiscTime + ConsultationTime + RingTime + Default_ACW + Wrap) / NULLIF ([Calls Ans], 0) AS DECIMAL(18, 2)) AS 'AHT'
, CAST([Comfort Break] / NULLIF (Logged, 0) AS DECIMAL(18, 6)) AS 'ComfortBreak'
, CAST([Designated Other] / NULLIF (Logged, 0) AS DECIMAL(18, 6)) AS 'DesignatedOther'
, CAST(Reflection / NULLIF (Logged, 0) AS DECIMAL(18, 6)) AS 'Reflection'
, CAST([System Failure] / NULLIF (Logged, 0) AS DECIMAL(18, 6)) AS 'SystemFailure'
, CAST(Skillset_Default_Activity_Code / NULLIF (Logged, 0) AS DECIMAL(18,6)) AS 'Skillset_Default_Activity_Code'
, [Short Calls Ans] AS 'ShortCallsAns'
, CASE WHEN CAST(([TalkTime] + [BreakTime] + [BusyonDNTime] + [BusyMiscTime] + [ConsultationTime] + [RingTime] + [Default_ACW] + [Wrap]) / NULLIF ([Calls Ans],0) AS DECIMAL(18, 2)) IS NULL
         AND CAST([Comfort Break] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Designated Other] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Reflection] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL AND CAST([System Failure] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Skillset_Default_Activity_Code] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL AND [Short Calls Ans] IS NULL
         THEN 0 
        ELSE 1 
        END AS DataFlag
FROM            PulseReportData
WHERE        (CAST(Day AS DATE) = @ActivityDate) AND 
                     ((CASE WHEN CAST(([TalkTime] + [BreakTime] + [BusyonDNTime] + [BusyMiscTime] + [ConsultationTime] + [RingTime] + [Default_ACW] + [Wrap]) / NULLIF ([Calls Ans],0) AS DECIMAL(18, 2)) IS NULL
         AND CAST([Comfort Break] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Designated Other] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Reflection] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL AND CAST([System Failure] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Skillset_Default_Activity_Code] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL AND [Short Calls Ans] IS NULL
         THEN 0 
        ELSE 1 
        END) = 1)

报告有一个名为@Field 的参数,其值是上述列的列名(日期和代理除外)。报告上的第 2 列数据文本框包含以下表达式;

=Fields(Parameters!Field.Value).Value

因此,在报告运行之前从下拉列表中选择的列名称将显示在第二列中。

我不知道如何开始工作是这样的;

我需要添加一个参数,让用户选择 5、10、20 或 50 的排名编号,根据返回的数字显示前 5、10、20 或 50 名代理列被选中。我尝试将以下内容添加到数据集查询中;

ROW_NUMBER() OVER (partition BY @Field ORDER BY @Field DESC) AS rn

然后将 rn 列添加为报告中的第三列。然后,我对 tablix 应用了一个过滤器,以说明 rn 列的位置

发生的情况是报告中显示了代理和值列表,第三列中显示的排名值的正确数量是从@rank 下拉参数中选择的,但主列的值未在降序。他们似乎完全是随机的。因此,就像我添加到数据集查询的 ROW_NUMBER 列对参数内的列不感兴趣一样。我只是想不出一种方法来根据前 5、10、20 或 50 名恢复这些排名值:-S

【问题讨论】:

  • 你的主要专栏Agent是哪个?还是 AHT、ConfortBreak 等?
  • 唯一固定的列是Agent,其余的都是动态的。有点像数据透视表样式选择,但使用 SSRS 下拉参数。我需要能够对这些列中的任何一个进行排序和排名; ComfortBreak, DesignatedOther, Reflection, SystemFailure & Skillset_Default_Activity_Code 在运行中。
  • 我试图理解你所说的but the values of the main column were NOT ranked in a descending order是什么意思。

标签: sql-server reporting-services parameters ssrs-2008-r2 ranking


【解决方案1】:

有几种方法可以做到这一点,最简单的方法是向您的 sql 添加两个参数,这些参数映射到所选列和返回的所需行数。诀窍是您可以在 order by 语句中使用别名,因此通过 ComfortBreak 订购是完全可行的。在下面的示例中,我使用 offset fetch 将更改隔离到最后,以便更清楚地了解更改是什么,但 Select top @RowCount 也可以。

SELECT CAST(Day AS DATE) AS 'Day'
, ISNULL(externalID, '**No Agent**') AS 'Agent'
, CAST((TalkTime + BreakTime + BusyonDNTime + BusyMiscTime + ConsultationTime + RingTime + Default_ACW + Wrap) / NULLIF ([Calls Ans], 0) AS DECIMAL(18, 2)) AS 'AHT'
, CAST([Comfort Break] / NULLIF (Logged, 0) AS DECIMAL(18, 6)) AS 'ComfortBreak'
, CAST([Designated Other] / NULLIF (Logged, 0) AS DECIMAL(18, 6)) AS 'DesignatedOther'
, CAST(Reflection / NULLIF (Logged, 0) AS DECIMAL(18, 6)) AS 'Reflection'
, CAST([System Failure] / NULLIF (Logged, 0) AS DECIMAL(18, 6)) AS 'SystemFailure'
, CAST(Skillset_Default_Activity_Code / NULLIF (Logged, 0) AS DECIMAL(18,6)) AS 'Skillset_Default_Activity_Code'
, [Short Calls Ans] AS 'ShortCallsAns'
, CASE WHEN CAST(([TalkTime] + [BreakTime] + [BusyonDNTime] + [BusyMiscTime] + [ConsultationTime] + [RingTime] + [Default_ACW] + [Wrap]) / NULLIF ([Calls Ans],0) AS DECIMAL(18, 2)) IS NULL
         AND CAST([Comfort Break] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Designated Other] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Reflection] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL AND CAST([System Failure] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Skillset_Default_Activity_Code] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL AND [Short Calls Ans] IS NULL
         THEN 0 
        ELSE 1 
        END AS DataFlag
FROM            PulseReportData
WHERE        (CAST(Day AS DATE) = @ActivityDate) AND 
                     ((CASE WHEN CAST(([TalkTime] + [BreakTime] + [BusyonDNTime] + [BusyMiscTime] + [ConsultationTime] + [RingTime] + [Default_ACW] + [Wrap]) / NULLIF ([Calls Ans],0) AS DECIMAL(18, 2)) IS NULL
         AND CAST([Comfort Break] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Designated Other] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Reflection] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL AND CAST([System Failure] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL 
         AND CAST([Skillset_Default_Activity_Code] / NULLIF ([Logged], 0) AS DECIMAL(18, 6)) IS NULL AND [Short Calls Ans] IS NULL
         THEN 0 
        ELSE 1 
        END) = 1)
order by @SelectedColumn /* acs/desc whatever is appropriate */
offset 0 rows fetch next @RowsReturned only

【讨论】:

  • 酷,我没有注意到 T-SQL 引入了偏移/获取!
  • 感谢您迄今为止的建议。我有点挣扎。此查询用于填充 SSRS 数据集。我发现我不能在 ORDER BY 子句中使用我的 @Field 参数。我并没有真正考虑如何实施SELECT TOP @RowCount 的建议,您能否为我详细说明一下?它让我发疯!谢谢:D
  • 好的,可能发生的情况是列别名与参数的值不匹配,您能否发布用于填充该参数的数据集?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
相关资源
最近更新 更多