Informatica行列转化实现
表:SALES、SALES2
在session的Mapping选项卡的Targets中选中Truncate target table option 是为了先把目标表中的数据彻底删除。
1、行转列:
1)导入源表:SALES
2)导入目标表:SALES2
3)创建Mapping,命名为mapping_1。
4)将源表和目标表拖拽入Mapping Designer。
5)创建Normalizer Transformation(用于将一行变成多行),编辑该转换,选择
“Normalizer”页面,添加对应的输出字段,其中level可理解为group by等级,Occurs 相当于循环次数,即该字段可能有几行(几个等级)输出。
6)查看Ports页面,系统将自动生成一系列字段。其中GCID_
这个端口产生一个序号指名当前输出来自多个输入中的哪一个;GK_XXX,由这个端口产生一个序列号值,在需要时可以作为主键,运行成功后会在知识库中保存下一个值,可以在Mapping中看到下一个值,可以修改这个值;
7)连接SQ到Normalizer以及Normalizer到目标表的对应字段。
8)创建工作流并运行即可。
附SQL代码:
SELECT STORENAME,QUARTER1 AS SALES, 1 AS QUARTER
FROM SALES
GROUP BY STORENAME,QUARTER1 ------level
UNION
SELECT STORENAME,QUARTER2 AS SALES, 2 AS QUARTER
FROM SALES
GROUP BY STORENAME,QUARTER2
UNION
SELECT STORENAME,QUARTER3 AS SALES, 3 AS QUARTER
FROM SALES
GROUP BY STORENAME,QUARTER3
UNION
SELECT STORENAME,QUARTER4 AS SALES, 4 AS QUARTER
FROM SALES
GROUP BY STORENAME,QUARTER4
2、列转行:
1)导入源表:SALES2
2)导入目标表:SALES
3)创建Mapping,命名为mapping_2。
4)将源表和目标表拖拽入Mapping Designer。
5)添加表达式转换Expression Transformation,从SQ拖拽相应的port到expression中,
并在expression中添加相应的输出端口,以及相应的表达式条件。
6)添加聚合函数转换,并进行分组。
7)连接到目标表的对应的输出端口。
8)创建工作流并运行即可。
附SQL代码:
SELECT STORENAME,
MAX(CASE WHEN QUARTER=1 THEN SALES ELSE 0 END) QUARTER1, MAX(CASE WHEN QUARTER=2 THEN SALES ELSE 0 END) QUARTER2, MAX(CASE WHEN QUARTER=3 THEN SALES ELSE 0 END) QUARTER3, MAX(CASE WHEN QUARTER=4 THEN SALES ELSE 0 END) QUARTER4 FROM SALES2
GROUP BY STORENAME
ORDER BY STORENAME