8.5 填充法行转列,列名动态生成
将行动态转换为列,根据记录计算动态生成列名,最后将所有数据一起填充进新序表。
如根据收入明细,统计每位员工各类收入的情况,类别自动生成:
Name | Source | Income |
---|---|---|
David | Salary | 8000 |
David | Bonus | 15000 |
Daniel | Salary | 9000 |
Andrew | Shares | 26000 |
Andrew | Sales | 23000 |
Robert | Bonus | 13000 |
每个人的收入来源都可能不相同,想要转换成如下结果:
Category | Source1 | Income1 | Source2 | Income2 |
---|---|---|---|---|
David | Salary | 8000 | Bonus | 15000 |
Daniel | Salary | 9000 | ||
Andrew | Shares | 26000 | Sales | 23000 |
Robert | Bonus | 13000 |
不确定行转列后,列的数量,甚至连列名也不能完全确定。这时就不能使用 pivot 函数了,而需要使用代码进行动态转置。
脚本:
A | B | |
---|---|---|
1 | =connect(“db”) | =A1.query@x(“select * from Income”) |
2 | =B1.group(Name) | =A2.max(~.len()) |
3 | =create(Name, ${B2.(“Source”+string(~)+“, Income”+string(~)).concat@c()}) | |
4 | for A2 | =A4. Name | A4.conj([Source, Income]) |
5 | >A3.record(B4) |
A3:分组后,以各组成员数最大者为列数,并动态产生列名,创建序表。
A4~B5:对各组循环,将各组的姓名、收入来源和收入金额拼成序列,添加到 A3 创建的序表中。