在SSIS中取消数据

时间:2011-09-26 14:41:20

标签: sql-server ssis unpivot

我正尝试使用以下格式的SSIS对数据进行规范化:

SerialNumber  Date       R01  R02  R03  R04 
-------------------------------------------
1             9/25/2011  9    6    1    2
1             9/26/2011  4    1    3    5
2             9/25/2011  7    3    2    1
2             9/26/2011  2    4    10   6

每个“R”列代表一小时的读数。 R01是12:00 AM,R02是凌晨1:00,R03是凌晨2:00,R04是凌晨3:00。我想转换数据并将其以这种格式存储在另一个表中(换行符为可读性):

SerialNumber  Date                Reading
-----------------------------------------
1             9/25/2011 12:00 AM  9    
1             9/25/2011 1:00 AM   6    
1             9/25/2011 2:00 AM   1   
1             9/25/2011 3:00 AM   2   

1             9/26/2011 12:00 AM  4    
1             9/26/2011 1:00 AM   1    
1             9/26/2011 2:00 AM   3   
1             9/26/2011 3:00 AM   5   

2             9/25/2011 12:00 AM  7    
2             9/25/2011 1:00 AM   3    
2             9/25/2011 2:00 AM   2   
2             9/25/2011 3:00 AM   1

2             9/26/2011 12:00 AM  2    
2             9/26/2011 1:00 AM   4    
2             9/26/2011 2:00 AM   10   
2             9/26/2011 3:00 AM   6

我在SSIS 2008包中使用unpivot转换来完成大部分工作,但我遇到的问题是根据我正在使用的值的列添加小时到日期。有没有办法在SSIS中实现这一目标?请记住,这是大约3000万条记录的一小部分数据,因此性能是一个问题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

  1. 创建SSIS个包并添加新的Data Flow Task并配置此DFT(Edit...
  2. 添加新数据源
  3. 添加UNPIVOT组件并对其进行配置: enter image description here
  4. 添加DATA CONVERSION组件: enter image description here 临时结果: enter image description here
  5. 添加DERIVED COLUMN组件: enter image description here 对于NewData派生列,您可以使用以下表达式:DATEADD("HOUR",(Type == "R01" ? 0 : (Type == "R02" ? 1 : (Type == "R03" ? 2 : 3))),Date)«boolean_expression» ? «when_true» : «when_false»运算符与IIF()函数(来自VBA / VB)类似,用于计算要添加的小时数:对于“R01” - > 0小时,“R02” - > 1小时,“R03” - > 2小时或3小时(“R04”)。

    结果: enter image description here