PDI Kettle:动态行转列 dynamic pivot

以下是原始数据结构:

| 人名 | 科目 | 成绩
| A | 语文 | 90
| A | 数学 | 70
| A | 英语 | 40
| B | 语文 | 10
| B | 数学 | 20
| B | 英语 | 30
| C | 语文 | 1
| C | 数学 | 2
| C | 英语 | 3

目标结构:
| 科目 | A | B | C
| 语文 | 90 | 10 | 1
| 数学 | 70| 20 | 2
| 英语 | 40 | 30 | 3

因为人名有很多,且不确定。所以不能简单地用“列转行”组件。

请问有什么方法可以动态地转置?

注意不能假设人名和科目是确定的。即人名可能会增加“D”,科目可能会增加“体育”。

谢谢指点!

如果不确定的话,只能用临时表,用存储过程或者批处理了。

我自己研究出来解决方案。用"ETL metadata injection"组件。

思路:

  1. 建立2个转换:“01 列转行”和“02 metadata injection”
  2. “01 列转行”里有常规的“列转行”组件。用hard-code的方式来实现问题中的目标结构
  3. “02 metadata injection”含有以下2个关键组件:
    3.1. “分组”组件:动态地把数据源中的“人名”记录出来
    3.2. "ETL metadata injection"组件:把“分组”组件得到的“人名”输入到“01 列转行”里的“列转行”组件(如下图)

img