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