【问题标题】:Nested aggregate error with SSRS subtotal and grand total带有 SSRS 小计和总计的嵌套聚合错误
【发布时间】:2013-07-04 16:48:08
【问题描述】:
SQL Server 2012
Visual Studio 2010
Dataset being used is called Performance
Formulas
ACB = Average Capital Base
IRR = Internal Rate of return = Total Gain/ACB
Contribution = ACB/Sum(ACB)*IRR 

我正在尝试计算投资贡献。 这是一个示例计算。

Account Total Gain  ACB     IRR     Contribution
ABC     2,000.00    20,000  10%        6.67%
DEF     2,000.00    10,000  20%        6.67%
total   4,000.00    30,000  13.33%     13.33%

Total IRR 和 Total Contribution 总是相等的

请注意,贡献是单行 ACB 乘以 ACB 的总和,然后乘以单行 IRR。

我有以下报告。我的问题是由于嵌套聚合,我无法进行小计和总计。我也不确定如何定位正确的数据范围。

IRR 和 IRR 小计表达式(工作)

=Fields!TotalGain.Value/Fields!ACB.Value
=Sum(Fields!TotalGain.Value)/Sum(Fields!ACB.Value)

试图让 Contribution 计算起作用(得出错误的数字)

=Fields!ACB.Value/Sum(Fields!ACB.Value, "Performance")*Fields!IRR.Value

试图得到贡献的小计和总和(尽管数字是错误的)

=sum(Fields!ACB.Value/Sum(Fields!ACB.Value, "Performance")*Fields!IRR.Value)

我收到此错误

Error   3   [rsInvalidNestedDataSetAggregate] The Value expression for the text box ‘Textbox29’ has a nested aggregate that specifies a dataset scope.  Inner aggregates cannot specify a dataset scope.    F:\Automater\SSRS\Reports_2012\PerformanceSample2.rdl   0   0   

我意识到错误与尝试对已求和的值求和有关,但这是计算所要求的。

【问题讨论】:

    标签: reporting-services dataset aggregate-functions


    【解决方案1】:

    根据您上面的描述,您似乎正在贡献分类级别,例如股票固定收益

    因此,在计算详细信息行的总 ACB 时,您需要计算特定 分类 范围内的总和。

    考虑一些简化的数据:

    我将此数据集称为 Performance 并基于它构建了一个报告:

    对于行级别的贡献,我使用了以下表达式:

    =Fields!ACB.Value / Sum(Fields!ACB.Value, "Classification")
      * (Fields!TotalGain.Value / Fields!ACB.Value)
    

    这里SUM表达式的Scope是组级别。

    对于小计,我使用了以下表达式:

    =Sum(Fields!ACB.Value) / Sum(Fields!ACB.Value, "Classification")
      * (Sum(Fields!TotalGain.Value) / Sum(Fields!ACB.Value))
    

    对我来说,这两个表达式似乎给出了预期的结果:

    您会注意到,由于在组级表达式中Sum(Fields!ACB.Value) 等价于Sum(Fields!ACB.Value, "Classification"),这实际上可以简化为Sum(Fields!TotalGain.Value) / Sum(Fields!ACB.Value),即IRR,这也是我们所期望的。

    如果您需要计算所有 分类的总数贡献,即总计,您必须更改@上述表达式中的 987654330@ 到 "Performance"

    希望这可以帮助您获得想要的结果。

    【讨论】:

    • 谢谢。我已经在下面发布了回复。
    【解决方案2】:

    伊恩·普雷斯顿,

    您的回答让我走上了正确的道路,并且非常接近让我达到总数。解决方案。因此,我将其标记为正确。但是我想添加一些额外的反馈。你是对的,我需要按行级别范围指定行,可以针对不同的分类级别进行切换,称为 ClassificationMemberName

    这是我的行级贡献公式

    =Fields!ACB.Value/Sum(Fields!ACB.Value, "ClassificationMemberName")
    * (Fields!TotalGain.Value/ fields!ACB.Value)
    

    由于小计的某些原因,我需要将值乘以 2 才能得到正确的结果?但是,这只适用于资产级别的分类。如果我按总投资组合分类,价值翻倍。

    =sum(Fields!ACB.Value, "ClassificationMemberName")/
    Sum(Fields!ACB.Value, "Performance")
    *
    sum(Fields!TotalGain.Value, "ClassificationMemberName")/
     sum(fields!ACB.Value, "ClassificationMemberName")*2
    

    如果您想了解我的意思,我附上了 rdl。非常感谢您的努力。

    这里是rdl

    https://dl.dropboxusercontent.com/u/29851290/PerformanceSample2.rdl

    【讨论】:

    • 酷,感谢您的更新 - 很高兴看到它有所帮助!不确定乘数;它实际上取决于基础数据和报告分组的组合。如果您想进一步排除故障,我只能建议添加显示所有临时计算的调试列,即Sum(Fields!ACB.Value, "Performance"),并尝试查看其中一个或多个是否看起来不正确并因此影响整体值,然后进行相应更新。
    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多