在 SSIS 中反透视数据

Posted

技术标签:

【中文标题】在 SSIS 中反透视数据【英文标题】:Unpivoting Data in SSIS 【发布时间】:2011-09-26 14:41:19 【问题描述】:

我正在尝试使用以下格式的 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,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】:
    创建一个SSIS 包并添加一个新的Data Flow Task 并配置此DFT (Edit...) 添加新数据源 添加UNPIVOT 组件并进行如下配置: 添加DATA CONVERSION组件: 临时结果:

    添加DERIVED COLUMN组件: 对于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”)。

    结果:

【讨论】:

以上是关于在 SSIS 中反透视数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Tableau 中反透视数据 将行转换为列

在 Postgresql 中反透视

在 SQL 中反透视表时获取值存在的列的位置

在 Flutter 中反序列化 JSON 数据

在 Java 中反序列化不受信任的数据有啥安全影响?

如何在 .NET 中反序列化为本地集合?