No results found

【SSIS】进行列转行格式的转换

问题引入

有如下格式的文件,需要转换成如图二的格式导入数据库里,这就是所谓的列传行的格式,是一种逆透视的操作。用Excel透视操作或者写个VBA宏程序是可以实现的,我们现在用SSIS的逆透视组件来实现下。

行格式

列格式

系统环境

  • Windows 7
  • SQL Server 2008 R2
  • Business Intelligence Development Studio

步骤

首先废话不多说,新建SSIS项目

新建SSIS项目

拖入EXCEL数据源,选择源文件。

拖入EXCEL数据源

拖入逆透视组件

逆透视组件

逆透视编辑器

打开逆透视编辑器,这里有几个说明的地方:

  • 1.可用输入列里面的传递,如果勾上了,这一列将不进行逆透视,就是直接输出到目标文件或者数据库里。
  • 2.可用输入列里左边的复选框勾上就是需要将这列进行逆透视的操作,勾选后将会出现在下面。
  • 3.下面目标列里默认是空的,需要自己填,这一列的值将会是源文件1号到31号每一列里的金额值,所以目标列填的都一样,略坑的是需要一个一个填,我复制黏贴了30遍。
  • 4.透视键值列名最好改个名称,就是输入列逆透视后放在那一列下面,这里填的就是列名,1号到31号将会作为“几号”列下面的值。

其他默认,按确定。确认完了,发现有错误。提示:

数据流任务 [逆透视 [116]] 出错: UnPivot 元数据不正确。在 UnPivot 转换中,对于所有设置了 PivotKeyValue 且指向相同 DestinationColumn 的输入列,其元数据都必须与 DestinationColumn 完全匹配。

报错

这是啥问题,折腾了一点时间,在逆透视组件的高级编辑器了怎么调都不好使。仔细看了下,会不会是数据类型的问题,果然,逆透视列的数据类型不是都一样的,所以就添加了一个数据转换组件。

数据类型

数据类型

数据类型转换

在数据转换组件里把字符串类型都转成浮点型数据。

逆透视编辑器

最好把之前的那个逆透视的组件删了,重新建一个。把逆透视的列改成类型转换的输出列,目标列又复制黏贴了30次。

这样逆透视的组件就不会报错了,然后执行下数据流,哟,报错了,提示一个或多个组件未能通过验证。

再次报错

噢,才想起来项目属性里有一个调试设置什么64位运行环境的要改成false才可以。

项目属性

这样就不会报错了。

顺利执行

拖入EXCEL目标组件,列与逆透视组件输出列对应,目标EXCEL是有表头的。

EXCEL目标组件

转换初见成果啊,但是看着有点不爽,想把年月跟几号列合成一个日期列,日期格式是20160406这种的,在目标表里加入一个日期列。

写入Excel文件

拖入一个派生列组件,在派生列编辑器里增加一列派生列,表达式如下,就是对字符串的截取拼接,这里就不解释了,然后在Excel目标里给这个派生列映射到目标表的“日期”。

(DT_WSTR,6)[年月] + RIGHT("0" + SUBSTRING([几号],1,FINDSTRING([几号],"日",1) - 1),2)

派生列

重新执行下数据流,嗯,达到目的。

执行成功

总结一下

  • 在使用处理数据列的组件之前最好加一个数据类型转换的组件,看看有哪些数据类型是不符合我们预期的。
  • 项目属性里的调试64位运行时不知道啥情况,为TRUE时会报错,得设置为FASLE。
  • 逆透视组件设置相对简单,找好逆透视的列以及行数据要放在哪列里就可以了。
文章目录
  1. 1. 问题引入
  2. 2. 系统环境
  3. 3. 步骤
  4. 4. 总结一下
|