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 创建的序表中。