某个表格的第1列是人名,后面多列是此人某次采购的产品,一个人一次可以采购多个同样的产品,也可以多次采购。
A | B | C | D | |
1 | John | Apple | Apple | Orange |
2 | Paul | Grape | ||
3 | John | Pear | ||
4 | Steve | Lychee | Grape | |
5 | Jessica | Apple |
需要整理成交叉表,上表头是产品,左表头是人名。
E | F | G | H | I | J | |
1 | Name | Apple | Orange | Pear | Grape | Lychee |
2 | Jessica | 1 | ||||
3 | John | 2 | 1 | 1 | ||
4 | Paul | 1 | ||||
5 | Steve | 1 | 1 |
使用 SPL XLL
=spl("=?.news( ~.m(2:).select(~); get(1)(1):Name, ~ ).pivot@s(Name; #2,count(#2))",A1:D5)
函数news用序列的每个成员生成一条记录,函数 get 在多层循环中按层数取循环变量,~.m(2:)表示当前成员的第 2 个到最后 1 个子成员,pivot@s行转列,并计算每组数据。(1)是序列的第 1 个子成员,#1 是二维表的第 1 列。