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

时间:2011-11-11 11:37:34

标签: reporting-services aggregate-functions

使用此数据集:

Category | Amount
A        | 5
A        | 3
B        | 6
B        | 2
B        | 1
C        | 7

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

Category | Percentage
A        | 33%
B        | 38%
C        | 29%

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

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)%

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

2 个答案:

答案 0 :(得分:26)

我会回答我自己的问题。

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

LookupSet(SourceFieldToCompare, TargetFieldToCompare, ResultField, DataSet)

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

Category | January | February | March
A        | 33%     | 37%      | 35%
B        | 38%     | 36%      | 37%
C        | 29%     | 27%      | 28%

假设问题中提到的数据集名为“类别”。现在,请致电LookupSet函数(Reference):

LookupSet(Fields!Month.Value, Fields!Month.Value, Fields!Amount.Value, "categories")

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

还有一个问题:LookupSet返回Object类型,Sum不会吃。您需要使用自定义聚合(在“报告属性”中添加自定义代码):( Source

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

现在,通过在Code.SumLookup函数上调用LookupSet,计算所有字段的总和。

答案 1 :(得分:2)

您可以使用范围描述符来标识要对其运行SUM的组:

  • 类别组在Tablix行组中定义。
  • DataSet1是数据集的名称。

分组金额:[总和(金额)]

数据集总计:SUM(字段!Amount.Value,“DataSet1”)

百分比:SUM(字段!Amount.Value,“类别”)/SUM(Fields!Amount.Value,“DataSet1”)