如何从 ssrs 获取查找值的平均值?

how do I get the average of lookup value from ssrs?

=Lookup(dsc.Value,Dsc.value,Fields!Fmotion.Value,"Stage")

我想获取该查找值的平均值。我如何编写一个表达式来显示该查找值的平均值?

Lookup(x,x,x,x) 仅 return 单个值;它找到的数据集中的第一个匹配项和单个值的平均值显然是该值。如果您想要所有符合查找条件的值的平均值,请使用 LookupSet 函数来 return 多个值。然后,您可以使用代码隐藏功能嵌入 VB 代码和 return LookupSet 的平均值:

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


Dim suma As Decimal = 0
Dim avga As Decimal = 0
Dim counta As Integer = 0

For Each item As Object In items
    If Not item Is Nothing Then
        counta += 1
        suma += Convert.ToDecimal(item)
    End If
Next

If counta > 0 Then
    avga = suma / counta
Else
    avga = 0
End If
Return avga
End Function

您在报告中用这样的表达式调用它:

=Code.AvgLookup( Lookupset(dsc.Value,Dsc.value,Fields!Fmotion.Value,"Stage") )

除了提供的解决方案。

要使用自定义函数,您首先需要将代码添加到报告中。您可以通过以下方式进行:

  1. 在设计视图中,right-click 报表边框外的设计图面,然后单击报表属性。
  2. 点击代码。
  3. 在自定义代码中,键入代码。当报告运行时,代码中的错误会产生警告。

更多详情here

Daniel 的回答完全解决了这个问题,对我也很有帮助。除了 AvgLookup 之外,我想补充另外两个通常相关的函数,这些函数将来可能会对其他人有所帮助。

其中之一是 SumLookup,由 another question 中的其他人提供。另一个是 StDevLookup,即 LookupSet 的标准偏差。我在 Stack Overflow 或其他地方找不到它,所以我编写了自己的函数,它使用 Daniel 的回答中的 AvgLookup:

Function StDevLookup(ByVal items As Object()) As Decimal

If items Is Nothing Then Return Nothing

Dim stdeva  As Decimal = New Decimal()
Dim avga As Decimal = New Decimal()
Dim suma As Decimal = New Decimal()
Dim ct As Integer = New Integer()
Dim variancea As Decimal = New Decimal()

avga = 0 
suma = 0
ct = 0
variancea = 0

avga = AvgLookup(items) 

For Each item As Object In items
  suma += (item - avga)^2
  ct += 1
 Next

variancea = suma / ct
stdeva = Sqrt(variancea)

Return stdeva

End Function

你也可以这样称呼它:

=Code.StDevLookup(LookupSet("RouteExample", Fields!Route.Value, Fields!SomeValueToBeCalculated.Value, "MyDataset"))