12.12 动态关联运算

 

某 Excel 中的 sheet 分为 3 类,其中 sheet A 是基础表,部分数据如下:

imagepng

Sheet B1\B2…Bn 是关联表,它们的格式都一样,且与 A 有相同的列 Interval1、Interval2、Interval3。其中 B1 的数据如下:

imagepng

Sheet C 用来描述 A 与 B1\B2..Bn 的 Join 类型,共 3 种,其中cross Join表示笛卡尔积;leftJoinBig表示左关联,关联列是 Interval1;leftJoinSmall也是左关联,关联列是 Interval1、Interval2。数据如下:

imagepng

计算目标:按照 sheet C 中的 join 类型将 sheet A 和 B1\B2..Bn 关联起来,从 A 中取 Interva1 列,从 B 取其他列,最后形成新的二维表。
以上面的 sheet B 为例(实际上每个 B 应当不同),如果 JoinType==crossJoin,则关联结果应该是:

imagepng

如果 joinType==leftJoinBig,则关联结果应该是:

imagepng

如果 joinType==leftJoinSmall,则关联结果应该是:

imagepng

这个计算需要循环遍历 sheet C,同时需要输出多个二维表,因此只能用脚本而不是公式来实现。
代码:

A B
1 =file(“data.xlsx”).xlsopen()
2 =A1.xlsimport@t(;“C”)
3 =tableA=A1.xlsimport@t(;“A”)
4 for A2 =tableB=A1.xlsimport@t(;A4.Table)
5 =case(A4.JoinType,“crossJoin”:xjoin(tableA:A;tableB:B),“leftJoinBig”:xjoin@1 (tableA:A;tableB:B,A.Interval1==Interval1),“leftJoinSmall”:xjoin@1(tableA:A;tableB:B,A.Interval1==Interval1 && A.Interval2==Interval2))
6 =B5.new(A.Interval1,B.Interval2,B.Interval3,B.Type,B.Value1,B.Value2,B.Value3)
7 =file(A4.Table+A4.JoinType+“.xlsx”).xlsexport@t(B6)

脚本函数 case 可对 Join 类型做分支判断,xjoin 算出笛卡尔积,@1 表示左关联。


帮你早下班 - esProc 桌面版与 Excel 数据处理
12.11 比对寻找变化
13.1 固定列的行转列