当您有可变数量的透视行时,如何使用 Informatica 透视数据?
Posted
技术标签:
【中文标题】当您有可变数量的透视行时,如何使用 Informatica 透视数据?【英文标题】:How to pivot data using Informatica when you have variable amount of pivot rows? 【发布时间】:2013-10-10 16:10:30 【问题描述】:根据我的earlier questions,当我的数据中包含可变数量的地址时,如何使用 Informatica PowerCenter Designer 对数据进行透视。我想从我的数据中旋转例如四个地址。这是源数据文件的结构:
+---------+--------------+-----------------+
| ADDR_ID | NAME | ADDRESS |
+---------+--------------+-----------------+
| 1 | John Smith | JohnsAddress1 |
| 1 | John Smith | JohnsAddress2 |
| 1 | John Smith | JohnsAddress3 |
| 2 | Adrian Smith | AdriansAddress1 |
| 2 | Adrian Smith | AdriansAddress2 |
| 3 | Ivar Smith | IvarAddress1 |
+---------+--------------+-----------------+
这应该是结果表:
+---------+--------------+-----------------+-----------------+---------------+----------+
| ADDR_ID | NAME | ADDRESS1 | ADDRESS2 | ADDRESS3 | ADDRESS4 |
+---------+--------------+-----------------+-----------------+---------------+----------+
| 1 | John Smith | JohnsAddress1 | JohnsAddress2 | JohnsAddress3 | NULL |
| 2 | Adrian Smith | AdriansAddress1 | AdriansAddress2 | NULL | NULL |
| 3 | Ivar Smith | IvarAddress1 | NULL | NULL | NULL |
+---------+--------------+-----------------+-----------------+---------------+----------+
我想我可以使用
SOURCE --> SOURCE_QUALIFIER --> SORTER --> AGGREGATOR --> EXPRESSION --> 目标表
但是我应该在 AGGREGATOR 和 EXPRESSION 转换中使用哪种端口?
【问题讨论】:
【参考方案1】:你应该使用类似这样的东西:
Source->Expression->Aggregator->Target
在表达式中,添加一个变量端口:
v_count expr: IIF(ISNULL(v_COUNT) OR v_COUNT=3, 1, v_COUNT + 1)
或
v_count expr: IIF(ADDR_ID=v_PREVIOUS_ADDR_ID, v_COUNT + 1, 1)
和3个输出端口:
o_addr1 expr: DECODE(TRUE, v_COUNT=1, ADDR_IN, NULL)
o_addr2 expr: DECODE(TRUE, v_COUNT=2, ADDR_IN, NULL)
o_addr3 expr: DECODE(TRUE, v_COUNT=3, ADDR_IN, NULL)
然后使用聚合器,按 ID 分组并始终选择 Max, 例如
agg_addr1: expr: MAX(O_ADDR1)
agg_addr2: expr: MAX(O_ADDR2)
agg_addr3: expr: MAX(O_ADDR3)
如果您需要更多非规范化端口,请添加额外端口并设置初始状态 相应的 v_count 变量。
【讨论】:
这是否适用于可变数量的地址?您不应该通过ADDR_ID
订购数据并在每次ADDR_ID
更改时重置v_count
吗?
它不适用于可变数量的地址,您至少需要指定一个最大值,但应该不再是问题,因为您还需要一个具有固定数量属性的目标(除非您想写入 CSV 文件)。是的,您需要按 ADDR_ID 分组,并在 ADDR_ID 更改时重置 v_count 变量。我认为您不需要对数据进行排序,因为您可以在 Source 限定符中点击 Order 复选框,因此您可以保存使映射更高效的顺序转换
我指出这一点是因为 OP 明确询问了关于旋转可变数量的行并包含适当的源数据样本。
确实如此。但是我不知道没有固定限制的任何方法(你可以尝试添加一个非常高的限制,比如 999 左右)。如果你真的需要旋转,我会使用另一个工具。想到了 Rapidminer。
v_count = IIF(ADDR_ID=v_previous_ADDR_ID, v_count+1, 1)
怎么样?当然,仍然会有最大数量的地址可以处理(在DECODE
语句中,在目标定义中),但是这样计数器对于 4 个地址以及 3、2 或 1 个地址都可以正常工作。你counter 会将 1、2、3 分配给 John Smith
,然后将 1、2 分配给 Adrian Smith
,最后将 3 分配给 Ivar Smith
- 我说的对吗?【参考方案2】:
试试这个:
SOURCE --> SOURCE_QUALIFIER --> RANK --> AGGREGATOR -->TARGET
在 RANK 转换中,按 ADDR_ID 分组并选择 ADDRESS 作为排名端口。在属性选项卡中,选择排名数为 4。
在 AGGREGATOR 转换中按 ADDR_ID 分组并使用以下输出端口表达式(RANKINDEX 将由 RANK 转换生成):
ADDRESS1 = MAX(ADDRESS,RANKINDEX=1)
ADDRESS2 = MAX(ADDRESS,RANKINDEX=2)
ADDRESS3 = MAX(ADDRESS,RANKINDEX=3)
ADDRESS4 = MAX(ADDRESS,RANKINDEX=4)
【讨论】:
以上是关于当您有可变数量的透视行时,如何使用 Informatica 透视数据?的主要内容,如果未能解决你的问题,请参考以下文章