【问题标题】:What type of object does Reporting Services use to pass multiple rows to custom aggregate functions?Reporting Services 使用什么类型的对象将多行传递给自定义聚合函数?
【发布时间】:2013-10-30 17:00:04
【问题描述】:

假设以下数据集:


declare
    @datesTest table(dateId date, someValue int)
insert into
    @datesTest 
values
    ('01/01/2013', 15),
    ('01/01/2013', 15),
    ('02/01/2013', 0),
    ('03/01/2013', 27),
    ('03/01/2013', 27),
    ('03/01/2013', 27),
    ('04/01/2013', 44),
    ('04/01/2013', 44),
    ('05/01/2013', 0)

/* data is in this format with about 15 other fields that make distinct at this level not viable */
select
    *
from
    @datesTest;

/* not the average I want */
select
    avg(someValue) incorrectAvg
from
    @datesTest;

/* the average I do want (avg of distinct) */
select
    avg(_1.someValue) correctAvg
from
(
    select distinct
        *
    from
        @datesTest
)_1

还假设我无法更改数据集或操作 SQL 中的字段。

从 Reporting Services,我想创建一个自定义函数,以某种形式接受这些值,删除重复项,然后返回真正的平均值。

我遇到的问题是我不确定 SSRS 使用哪种类型的对象将多行传递给自定义函数。

【问题讨论】:

  • 什么版本的SSRS?

标签: sql vb.net visual-studio ssrs-2008 aggregate-functions


【解决方案1】:

我相信您可以创建一个引用另一个数据集的数据集。

创建数据集父列表。这将是您的过滤器数据集。您应该只返回一个值列,并且应该能够从原始数据集(具有重复行的数据集)中提取此列表。您只需要拉取平均的值。 创建一个名为 ParentList 的新报表参数。将可用值和默认值设置为来自数据集 ParentList 的值列结果。将参数设置为隐藏。 创建第二个数据集 RealAverage(或其他)。将 ParentList 作为参数添加到数据集 RealAverage,称为 @ParentList。

在子查询中,使用如下参数:

SELECT DISTINCT(my column) WHERE valueColumn IN (@ParentList)

这将返回唯一行,然后您可以使用标准 SSRS Avg

它不是很干净,但应该可以解决问题。尝试从数据集创建参数,请记住,参数只能从一行数据集创建。

我希望这会有所帮助。

【讨论】:

  • 这是个好建议。让我稍微修改一下,如果有效,我会将其标记为正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多