如何对两个 Excel 表实现各种类型的 JOIN

本文介绍如何利用VBA在Excel中处理不同类型的JOIN操作,包括cross JOIN、leftJoinBig和leftJoinSmall。通过创建脚本,结合集算器进行结构化计算,将基础表与多个关联表进行有效关联,生成新的Excel文件。脚本中,case函数用于根据JOIN类型进行分支判断,xjoin和@1分别用于实现笛卡尔积和左关联。
部署运行你感兴趣的模型镜像

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

ABC
1interval1interval2interval3
21 hour1 day1 week
32 hours2 days2 weeks
43 hours3 days3 weeks
54 hours4 days4 weeks

Sheet B1\B2…Bn是关联表,它们的格式都一样,且与A有相同的列interval1、interval2、interval3。其中一个B的部分数据如下:

ABCDEFG
1interval1interval2interval3Typevalue1value2value3
22 hours1 day7 weekcircle37108.14.1
33 hours3 days7 weeksLine39117.54.2
44 hours4 days7 weeksLine351274.3

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

AB
1tablejoinType
2B1crossJoin
3B2leftJoinBig
4B3leftJoinSmall

计算目标:按照sheet C中的join类型将sheet A和B1\B2..Bn关联起来,从A中取interva1列,从B取其他列,最后形成n个Excel文件。

以上面的sheet B为例(实际上每个B应当不同),如果joinType==crossJoin,则关联结果应该是:

ABCDEFG
1interval1interval2interval3Typevalue1value2value3
21 hour1 day7 weekCircle37108.14.1
31 hour3 days7 weeksLine39117.54.2
41 hour4 days7 weeksLine351274.3
52 hours1 day7 weekcircle37108.14.1
62 hours3 days7 weeksLine39117.54.2
72 hours4 days7 weeksLine351274.3
83 hours1 day7 weekcircle37108.14.1
93 hours3 days7 weeksLine39117.54.2
103 hours4 days7 weeksLine351274.3
114 hours1 day7 weekcircle37108.14.1
124 hours3 days7 weeksLine39117.54.2
134 hours4 days7 weeksLine351274.3

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

ABCDEFG
1interval1interval2interval3Typevalue1value2value3
21 hour
32 hours1 day7 weekcircle37108.14.1
43 hours3 days7 weeksline39117.54.2
54 hours4 days7 weeksline351274.3

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

ABCDEFG
1interval1interval2interval3typevalue1value2value3
21 hour
32 hours
43 hours3 days7 weeksline39117.54.2
54 hours4 days7 weeksline351274.3

这个计算需要循环遍历sheet C,因此只能用脚本而不是公式来实现。Join属于结构化计算,VBA缺乏直接可用的函数,代码会非常繁琐。

实现步骤:

1.      运行集算器(可以到润乾官网下载,用职场版,首次运行时会提示加载授权,下载个免费的就够了)

2.  编写脚本并执行

AB
1=file("data.xlsx").xlsopen()
2=A1.xlsimport@t(;"C")
3=tableA=A1.xlsimport@t(;"A")
4for 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 表示左关联。

您可能感兴趣的与本文相关的镜像

HunyuanVideo-Foley

HunyuanVideo-Foley

语音合成

HunyuanVideo-Foley是由腾讯混元2025年8月28日宣布开源端到端视频音效生成模型,用户只需输入视频和文字,就能为视频匹配电影级音效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值