如何将组内的聚合与SSRS中的组之间的聚合组合在一起

vst*_*ien 13 aggregate-functions reporting-services

使用此数据集:

Category | Amount
A        | 5
A        | 3
B        | 6
B        | 2
B        | 1
C        | 7
Run Code Online (Sandbox Code Playgroud)

我想在类别上创建一个tablix分组,显示总金额的百分比:

Category | Percentage
A        | 33%
B        | 38%
C        | 29%
Run Code Online (Sandbox Code Playgroud)

这应该是一个简单的计算:

Category | Percentage
A        | ((Sum of Amount within group / Sum of Amount across groups) * 100)%
B        | ((Sum of Amount within group / Sum of Amount across groups) * 100)%
C        | ((Sum of Amount within group / Sum of Amount across groups) * 100)%
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何在报表设计器(SSRS)中执行此操作 - 每当我创建行分组时Category,我都可以获得组内的总和=Sum(Fields!Amount.Value).但是如何从组内的单元格中获取各组之间的总和?

vst*_*ien 26

我会回答我自己的问题.

在任何表达式中,都可以在所有数据集中执行查找.通过这种方式我们将获得数据:

LookupSet(SourceFieldToCompare, TargetFieldToCompare, ResultField, DataSet)
Run Code Online (Sandbox Code Playgroud)

现在,让我们提高问题的标准,并说数据分组在另一个维度,几个月 - 像这样:

Category | January | February | March
A        | 33%     | 37%      | 35%
B        | 38%     | 36%      | 37%
C        | 29%     | 27%      | 28%
Run Code Online (Sandbox Code Playgroud)

假设问题中提到的数据集名为"类别".现在,调用LookupSet函数(参考):

LookupSet(Fields!Month.Value, Fields!Month.Value, Fields!Amount.Value, "categories")
Run Code Online (Sandbox Code Playgroud)

(请记住,第一个"月"链接到Tablix中的数据集,第二个参数中的第二个"月"是"类别"数据集中的"月"!)

还有一个问题:LookupSet返回不会吃的Object类型Sum.您需要使用自定义聚合(在"报告属性"中添加自定义代码):( 来源)

Function SumLookup(ByVal items As Object()) As Decimal
  If items Is Nothing Then
    Return Nothing
  End If

  Dim suma As Decimal = New Decimal()
  suma = 0

  For Each item As Object In items
    suma += Convert.ToDecimal(item)
  Next

  Return suma
End Function
Run Code Online (Sandbox Code Playgroud)

现在,通过调用Code.SumLookupLookupSet函数的总和来计算的所有领域.

  • +1严重来说这让我很生气 - 为什么他们会给你LookupSet功能,它不能与Sum agg一起使用! (3认同)