将每个组的第一个元素和 RunningValue 相加

Posted

技术标签:

【中文标题】将每个组的第一个元素和 RunningValue 相加【英文标题】:Sum the first element of each group and with RunningValue 【发布时间】:2015-10-14 19:27:32 【问题描述】:

我有一份关于 s-s-rS 的报告,其中包含以下 3 个字段的数据集:

Fields!MyFirstField.Value
Fields!MySecondField.Value
Fields!MyThirdField.Value

报告分为一组: 在我的行文件中,我有

MyPrimaryGroup
  MySeconday Group

我有组成每个组的字段:

Fields!Group.Value

思路是把每个字段的每组的第一个元素累加起来。

我做了以下事情:

Dim Acum as Double
Dim ActualGroup = ""
Function Accumulator(ByVal MyGroup as String, ByVal value as Double) As Double


If ActualGroup <> MyGroup
    Acum= Acum + value
    ActualGroup = MyGroup 
    Return Acum
    value=0
End If


End Function

在这之后我做了一个这样的计算字段:

=Code.Accumulator(Fields!Group.Value,Fields!MyFirstField.Value)

并在我的primary group里面排成一排,事情是,它只是累积前两个,例如:

在这张图片中,我们有一个图形示例,代码所做的是保存每个组的第一个元素,因此在这种情况下,累积值应该是 10+11+12=33,但代码给我的是 21,而不是保存第三个值以后]

这是问题的一部分,另一个问题是我无法使此累加器与具有运行值表达式的字段一起使用,例如:

FormatNumber(RunningValue(Fields!MySecondField.Value, Sum,"MyDataset"), 2)

有没有办法对每个组的第一个元素求和并累加其值,与实际上是运行值的字段相同?

为了向您提供有关我要实现的目标的更多信息,我截取了表格:

你看到蓝色圆圈的地方是我想要放置代码的组内的那些字段,MyField3 是运行值,这些是组:

这或多或少是我组中前两个元素的信息:

所以代码应该:

If MERCH308 <> "" then
0 = 0 + 6,80
"" = MERCH308
End If

在下一组应该这样做:

If MERCH314 <> MERCH308
6,80 = 6,80 + 22,28
MERCH308 = MERCH314
End If

到下一个:

If MERCH314 <> MERCH314
//It does not enter the if

在它看到一个不同于 MERCH314 的新组之前,问题是,代码正常运行的唯一方法(正如我进一步调查的那样)是取消标记 tablix 中的分页符并标记“将所有内容保持在一个如果可能,页面”。

我想对 runningvalue 问题说的是以下内容:

MyFields3 是一个运行值:

=FormatNumber(RunningValue(Fields!MyFields3.Value, Sum,"MyDataset",2)

但我不能申请:

Code.Accumulator(Fields!MyGroup.Value,RunningValue(Fields!MyFields3.Value,Sum,"Mydataset")

正如它所说的“有一个不正确的数字作为函数 RunningValue 的参数”

所以这个想法是累加累加器的每组的第一个元素,因为“RunningValue”实际上是一个累加器,所以这个想法是求和(对于我的第三列)6,80 + 29,08。但请记住,29,08 是运行值的结果。

【问题讨论】:

好的,我用分页符解决了这个问题。如果有人遇到同样的问题,您必须将变量声明为公共共享,因为每个分页符都是一个新实例,并且公共共享您的值将持续存在。现在讨论 runningvalue 的问题 【参考方案1】:

我可以帮助你解决问题的第一部分,所以我的回答是部分的,因为我没有得到你关于运行值字段的问题,所以我试图猜测你需要什么。

你必须去report / report properties / code标签并添加以下代码:

Dim public total as Integer 
Dim public prevgroup as String = ""

Public Function AddTotal(ByVal group as String,ByVal value AS Integer ) AS Integer 
    If (group <> prevgroup) Then
        total = total + value
        prevgroup = group
        return total
    End If
    return 0                
End Function 

Public Function GetTotal() 
    return total
End Function 

这是您对数据排列的猜测。

使用此表达式获取每个不同组的第一个值的总和:

=Code.GetTotal()

用这个来获取运行值:

=Code.AddTotal(Fields!Group.Value,Fields!Value.Value)

它将预览:

红色矩形代表我的数据集,其他数据由表达式添加。


更新:第一个值的运行值基于用户规范。

如果这有帮助,请告诉我。

您可以通过在数据集查询中添加行号来实现此目的。

select
    ROW_NUMBER() OVER (Order by (select 1)) as row_num,
    *
from CTE

注意我只是添加行号并从 CTE 中选择所有字段。 这是我的数据集:

修改AddTotal函数如下

Dim public total as Integer 
Dim public prevgroup as String = ""

Public Function AddTotal(ByVal group as String,ByVal value AS Integer, ByVal nextGroup As String ) AS Integer 
    If (group <> prevgroup) Then
        total = total + value
        prevgroup = group
    End If

    If (group <> nextGroup) Then
        return total
    End If
    return 0         
End Function 

如下配置您的 tablix:

在表达式中设置如下代码:

=Code.AddTotal(Fields!Group.Value,Fields!Value.Value,
lookup(Fields!row_num.Value + 1,Fields!row_num.Value,Fields!Group.Value,"DataSet5")
)

选择表达式行并使用以下代码设置Row visibility

=Iif(Code.AddTotal(Fields!Group.Value,Fields!Value.Value,
lookup(Fields!row_num.Value + 1,Fields!row_num.Value,Fields!Group.Value,"DataSet5")
)=0,True,False)

这将预览下面的 tablix:

【讨论】:

嘿,亚历杭德罗,我用大量更多信息更新了我的初始线程。 这是个好主意,有没有什么办法可以用 RowNumber 来代替更改查询? @Nickso :不,我的方法使用lookup 获取下一个行组值。 Lookup 在数据集中查找一行(RowNumber 不能用作查找函数的参数或参数表达式)并返回用户指定的该行中的其他列值。我认为这是了解数据集未来行的唯一方法。分享您的 SQL 查询以帮助您添加行号,虽然很简单 这是一个巨大的查询,因为它是一个动态查询

以上是关于将每个组的第一个元素和 RunningValue 相加的主要内容,如果未能解决你的问题,请参考以下文章

如何将元组列表转换为 pandas 数据框,以便每个元组的第一个值代表一列?

如何提取每个子列表中每个元组的第一个元素?

如何跳过数组的第一个和最后一个元素的循环并将它们设置为常量值?

如何将元组的所有第一个元素与同一元组中相应的第二个元素进行比较

如何访问列表中元组的第一个元素?

SQLite - 每个组的第一个 - 复合顺序和相反的排序顺序