求和运算符
当需要对两个科目求和时,必须区分两种情况:
- 标识两个科目值的维度是同质的,即这两个科目在相同数量的维度上运算;在这种情况下,我们称为同质操作数。例如,假设管理自定义维度 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 |
因此,颠倒操作数的顺序会改变非同质操作数求和的结果。