求和运算符

当需要对两个科目求和时,必须区分两种情况:

  • 标识两个科目值的维度是同质的,即这两个科目在相同数量的维度上运算;在这种情况下,我们称为同质操作数。例如,假设管理自定义维度 1 和 2,我们可以有 [A] + [B]。在这种情况下,两个操作数是同质的,因为 A 科目的值和 B 科目的值在读取时都考虑了自定义维度 1 和 2 的所有元素;
  • 标识两个科目值的维度不是同质的,即这两个科目不在相同数量的维度上运算;在这种情况下,我们称为非同质操作数。例如,假设管理自定义维度 1 和 2,我们可以有 [A] + [B](Dest2.[GEN])。在这种情况下,两个操作数不是同质的,因为 A 科目的值在读取时考虑了自定义维度 1 和 2 的所有元素,而 B 科目的值在读取时考虑了自定义维度 1 的所有元素,同时自定义维度 2 固定为 GEN。

在同质操作数的情况下,求和具有"标准"行为,TGKML 脚本不需要特定语法;而非同质操作数则需要 BOUND 语法。

示例 1

假设在三个自定义维度上进行数据录入:成本中心、产品和部门,并且我们希望将总收入的值计算为产品销售产生的收入与其他收入之和

我们可以编写以下 TGKML 脚本:

[LO].[50099] := [50010] + [50020]

其中:

  • [LO] = 目标多维数据集(总额)
  • [50099] = 要计算的科目(总收入)
  • [50010] = 包含产品收入的输入科目
  • [50020]= 包含其他收入的输入科目

输入科目 50010

科目 自定义维度1 自定义维度2 自定义维度3 金额
50010 D11 D21 D31 5
50010 D11 D22 D32 6

输入科目 50020

科目 自定义维度1 自定义维度2 自定义维度3 金额
50020 D11 D21 D31 7
50020 D11 D22 D32 8
50020 D12 D21 D31 9

输出科目 50099

科目 自定义维度1 自定义维度2 自定义维度3 金额
50020 D11 D21 D31 5 + 7 = 12
50020 D11 D22 D32 6 + 8 = 14
50020 D12 D21 D31 0 + 9 = 9

因此,系统将两个科目中在所有维度上完全匹配的记录相加,并仅重写那些不匹配的记录。

让我们看一些示例,以更好地理解求和运算符的工作方式。

假设管理自定义维度 1 和 2,并且我们希望将 C00000 和 D00000 收入科目的值相加。此外,假设数据库中有以下数据。

输入科目 C0000

实体 科目 场景 类别 Dest1 Dest2 期间 金额
A00 C00000 2013BDG $AMOUNT D11 D21 01 50
A00 C00000 2013BDG $AMOUNT D11 D22 01 30

输入科目 D00000

实体 科目 场景 类别 Dest1 Dest2 期间 金额
A00 D00000 2013BDG $AMOUNT D11 D21 01 10
A00 D00000 2013BDG $AMOUNT D11 D22 01 20
A00 D00000 2013BDG $AMOUNT D12 D23 01 5

示例 2非同质操作数的求和。

[LO].[X00000] := [C00000](Dest1.[D11]) + [D00000];

在这种情况下,单个操作数的值为:

[C00000](Dest1.[D11])

实体 科目 场景 类别 Dest2 期间 金额
A00 C00000 2013BDG $AMOUNT D21 01 50
A00 C00000 2013BDG $AMOUNT D22 01 30

[D00000]

实体 科目 场景 类别 Dest1 Dest2 期间 金额
A00 D00000 2013BDG $AMOUNT D11 D21 01 10
A00 D00000 2013BDG $AMOUNT D11 D22 01 20
A00 D00000 2013BDG $AMOUNT D12 D23 01 5

系统将除执行定点读取的那个维度之外,在所有涉及维度上匹配的记录相加。

因此结果为:

实体 科目 场景 类别 Dest1 Dest2 期间 金额
A00 X00000 2013BDG $AMOUNT D11 D21 01 50 + 10
A00 X00000 2013BDG $AMOUNT D11 D22 01 30 + 20

D00000 科目的第三行消失了,因为自定义维度 2 的 D23 元素在 C00000 科目中没有任何对应项。

因此,一般来说,在非同质操作数相加时,数据可能会丢失

示例 3改变顺序的非同质操作数求和。

上一个示例涉及两个非同质操作数之间的求和。如果操作数多于两个,则执行运算的顺序很重要。

假设管理两个自定义维度 1 和 2,并且我们希望将 C00000、D00000 和 F00000 收入科目的值相加。此外,假设数据库中有以下数据。

输入科目 C0000

实体 科目 场景 类别 Dest1 Dest2 期间 金额
A00 C00000 2013BDG $AMOUNT D11 D21 01 10
A00 C00000 2013BDG $AMOUNT D11 D22 01 20

输入科目 D00000

实体 科目 场景 类别 Dest1 Dest2 期间 金额
A00 D00000 2013BDG $AMOUNT D11 GEN 01 30
A00 D00000 2013BDG $AMOUNT D12 GEN 01 40

输入科目 F00000

实体 科目 场景 类别 Dest1 Dest2 期间 金额
A00 F00000 2013BDG $AMOUNT D11 D21 01 50
A00 F00000 2013BDG $AMOUNT D11 D22 01 60
A00 F00000 2013BDG $AMOUNT D12 D21 01 70
A00 F00000 2013BDG $AMOUNT D12 D22 01 80

脚本

[LO].[X00000] := [C00000] + [D00000](Dest2.[GEN]) +[F00000]

的结果为

实体 科目 场景 类别 Dest1 Dest2 期间 金额
A00 X00000 2013BDG $AMOUNT D11 D21 01 10+30+50
A00 X00000 2013BDG $AMOUNT D11 D22 01 20+30+60
A00 X00000 2013BDG $AMOUNT D12 D21 01 70
A00 X00000 2013BDG $AMOUNT D12 D22 01 80

而如果我们颠倒操作数的顺序,即考虑脚本

[LO].[X00000] := [F00000] + [D00000](Dest2.[GEN]) + [C00000]

结果为:

实体 科目 场景 类别 Dest1 Dest2 期间 金额
A00 X00000 2013BDG $AMOUNT D11 D21 01 10+30+50
A00 X00000 2013BDG $AMOUNT D11 D22 01 20+30+60
A00 X00000 2013BDG $AMOUNT D12 D21 01 70+40
A00 X00000 2013BDG $AMOUNT D12 D22 01 80+40

因此,颠倒操作数的顺序会改变非同质操作数求和的结果。