12.12 动态关联运算
某 Excel 中的 sheet 分为 3 类,其中 sheet A 是基础表,部分数据如下:
Sheet B1\B2…Bn 是关联表,它们的格式都一样,且与 A 有相同的列 Interval1、Interval2、Interval3。其中 B1 的数据如下:
Sheet C 用来描述 A 与 B1\B2..Bn 的 Join 类型,共 3 种,其中cross Join表示笛卡尔积;leftJoinBig表示左关联,关联列是 Interval1;leftJoinSmall也是左关联,关联列是 Interval1、Interval2。数据如下:
计算目标:按照 sheet C 中的 join 类型将 sheet A 和 B1\B2..Bn 关联起来,从 A 中取 Interva1 列,从 B 取其他列,最后形成新的二维表。
以上面的 sheet B 为例(实际上每个 B 应当不同),如果 JoinType==crossJoin,则关联结果应该是:
如果 joinType==leftJoinBig,则关联结果应该是:
如果 joinType==leftJoinSmall,则关联结果应该是:
这个计算需要循环遍历 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 表示左关联。