当您有可变数量的透视行时,如何使用 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 透视数据?的主要内容,如果未能解决你的问题,请参考以下文章

当您有联系人 ID 时如何查询特定用户的所有短信

当您有列名“日期”时如何订购表 desc?

使用数据透视表(熊猫)中的小计行时保留索引部分(不同的列)

当您有重复的子字符串时如何正确替换字符串?

当您有不同高度的页面时,如何使页脚位于所有屏幕尺寸的底部?

如何使ggplot2中的可变条宽不重叠或间隙