0

假设以下数据集:


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 使用哪种类型的对象将多行传递给自定义函数。

4

1 回答 1

0

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

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

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

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

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

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

我希望这有帮助。

于 2013-10-31T00:40:57.887 回答