2011-09-26 128 views
3

我试图正常化使用以下格式SSIS数据:Unpivoting数据在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是凌晨1点,R02是凌晨1点,R03是凌晨2点,R04是凌晨3点。我想转换数据并将其存储在另一个表以这种格式(换行符以提高可读性):

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包的逆转置转换来完成这个最,但这个问题我我正在根据我正在使用的值的列添加小时到日期。有没有办法在SSIS中实现这一点?请记住,这是约3000万条记录的一小部分数据,因此性能是一个问题。

感谢您的帮助。

回答

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

+0

这完美地工作。非常感谢你! –