【问题标题】:How to Pivot a group of columns as rows in output如何将一组列作为输出中的行
【发布时间】:2014-04-09 16:21:49
【问题描述】:

我正在尝试转换具有如下布局的文件:

id1 | id2 | id3 |...| id34 | A | B | C | A | B | C | A | B | C | 100 group of A B C|
a1  | b1  | c1  |...| aa1  | 3 | 7 | 5 | 7 | 5 | 3 | 1 | 1 | 1 | ...               |
a2  | b2  | c2  |...| aa2  | 4 | 3 | 7 | 0 | 4 | 8 | 9 | 8 | 4 | ...               |

输出应该是:

id1 | id2 | id3 |...| id34 | A | B | C |
a1  | b1  | c1  |...| aa1  | 3 | 7 | 5 |
a1  | b1  | c1  |...| aa1  | 7 | 5 | 3 |
a1  | b1  | c1  |...| aa1  | 1 | 1 | 1 |
a2  | b2  | c2  |...| aa1  | 4 | 3 | 7 |
a2  | b2  | c2  |...| aa1  | 0 | 4 | 8 |
a2  | b2  | c2  |...| aa1  | 9 | 8 | 4 |

我目前正在通过脚本转换组件进行操作 但是速度很慢。

我对 Pivot 和 Unpivot 组件不是很熟悉

是否有任何选项可以设置行组| A | B | C | 并且 SSIS 会将其视为一组并将其转换为我想要的格式?

提前致谢!!

【问题讨论】:

  • 很确定脚本转换是这里的方法。我们在这里说话有多慢?您使用哪些 C# 字符串操作函数来拆分行?可能是您的代码可以改进以提高性能。数据是固定长度格式吗?或者管道分隔是如何定义字段的?
  • 我目前正在做myoutputBuffer.id1 = Row.id1; 我只是将一组 id 与相应的 A B C 一起拉到行中,然后在下一行相同的一组 id 和下一组 A B C 等等,我是也进行转换myoutputBuffer.A = Convert.Toint32(Row.A)actully m 将数据加载到 SQL SERVER,所以我需要转换为 Int,我的输入数据是管道分隔的。

标签: ssis flat-file


【解决方案1】:

我会首先将文件“按原样”加载到一个宽 SQL 表中。我会给列组编号,例如

id1 | id2 | id3 |...| id34 | A | B | C | A | B | C | A | B | C | ...| a1 | b1 | c1 |...| aa1 | 3 | 7 | 5 | 7 | 5 | 3 | 1 | 1 | 1 | ... |

...加载到列中...

id1 | id2 | id3 |...| id34 | A1 | B1 | C1 | A2 | B2 | C2 | A3 | B3 | C3 | ... a1 | b1 | c1 |...| aa1 | 3 | 7 | 5 | 7 | 5 | 3 | 1 | 1 | 1 | ... |

然后我将创建一个变量(字符串)来保存由另一个变量(Int)驱动的动态 SQL 语句。我将创建一个 For Each 循环以将 Int 变量从 1 增加到 100。在循环中,我将使用字符串变量来驱动数据源。

第一次迭代,SQL 看起来像:

SELECT id1, id2, id3 ... id34, A1 AS A, B1 AS B, C1 AS C FROM Staging_Table

第二次迭代,SQL 将如下所示:

SELECT id1, id2, id3 ... id34, A2 AS A, B2 AS B, C2 AS C FROM Staging_Table

...等等。

每次迭代的输出将通过 OLE DB 目标进入目标表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-16
    • 2013-03-28
    • 1970-01-01
    • 2019-12-03
    • 2022-12-06
    • 2020-10-03
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多