SSIS 中的透视转换

SSIS 中的透视转换 (Pivot Transformation) 执行输入数据 (源数据) 的透视操作。SSIS 中的透视转换意味着将单个行数据转换为单独的列。

我们使用 SSIS 透视转换以交叉表或表格格式呈现数据,以便更好地理解。它将执行基于行的操作,并将行旋转到列,并将相应的值放在这些列下。如果没有值,它将用 NULL 填充。

在这里,我们将通过一个简单的例子来解释 SSIS 中的透视转换,以便您更好地理解。

透视转换正好与逆透视转换相反。在我们之前的文章中,我们已经讨论了 SSIS 2008R2 中的透视转换。虽然 SSIS 2008R2 和 2014 的功能相同,但 Microsoft 在 SQL Server 2012 中更改了透视转换的用户界面。这个修改后的版本比早期版本让开发者的生活轻松了很多。请参考 2008R2 部分的透视转换,以了解 2014 和 2008R2 中透视转换的区别。

注意:这并非强制要求,但对于未排序的数据,在透视转换之前使用排序转换始终是最佳实践。因为有时 SSIS 透视转换对于未排序的数据会产生奇怪的结果。

SSIS 中的透视转换示例

在此 SSIS 示例中,我们将对下表执行透视转换,将行数据(如日历年 2011、2012、2013 和 2014)转换为单独的列。

在此示例中,请考虑以下数据。

Source table

步骤 1:打开 BIDS,将数据流任务从工具箱拖到控制流,并将其重命名为 SSIS 2014 中的透视转换。

Data Flow Task 1

双击它,它将打开数据流选项卡。有关更多转换 >> 点击此处

步骤 2:将 OLE DB 源、透视转换从工具箱拖到数据流区域。

Pivot Transformation in SSIS 2

步骤 3:双击数据流区域中的 OLE DB 源,将打开连接管理器设置,并提供编写语句的空间。

OLE DB Source Editor 3

用于 SSIS 透视转换的 SQL 命令是:

SELECT PROD.ProductID,
       PROD.Name,
       YEAR(OrdHead.OrderDate) as OrderYear,
       SUM(Details.OrderQty) AS OrderQuantity
FROM Sales.SalesOrderDetail AS Details
     INNER JOIN
       Production.Product AS PROD ON
          Details.ProductID = PROD.ProductID
     INNER JOIN 
       Sales.SalesOrderHeader AS OrdHead ON
         Details.SalesOrderID = OrdHead.SalesOrderID
GROUP BY PROD.ProductID,
         PROD.Name,
         YEAR(OrdHead.OrderDate)
ORDER BY PROD.Name, 
         YEAR(OrdHead.OrderDate)

步骤 4:单击“列”选项卡以验证列。在这里,我们也可以取消选中不需要的列。

View Available Input Columns 4

单击“确定”,然后拖动 OLE DB 源的输出箭头到透视转换,以对源数据执行透视转换。

配置 SSIS 透视转换

步骤 5:双击或编辑透视转换。它将打开透视窗口,这与 SSIS 2008R2 中的透视转换略有不同。

Pivot Transformation in SSIS 5

下表说明了您可以在 SSIS 透视转换编辑器中使用的值:

选项描述
0列值将传递给转换。
1设置键。所有具有相同设置键的列。
2这是透视键 (这些列值将成为列名)。
3这是透视值,该列中的值将放置在透视转换创建的新列中。

因此,在此 SSIS 透视转换示例中:

ProductID = 0

Name = 1 (设置键)

OrderYear = 2 (透视键)

OrderQuantity = 3 (透视值)

Pivot Transformation in SSIS 6

单击“确定”并运行 SSIS 透视转换包。转到“进度”选项卡,检查列名,如下图所示。

注意:对于像本例中的 3 或 4 列,我们可以直接用列名替换 [Value1]、[Value2] 等,但在实际操作中,我们可能会处理 50 年的数据,那么在“生成透视输出列值”区域编写这 50 年的名称是不可能的。因此,最好运行包一次,然后从“进度”选项卡复制列名。

Progree Tab 7

停止调试模式并复制选定的值。

生成列

再次双击数据流区域中的 SSIS 透视转换,并将列名粘贴到“从值生成透视输出列”区域,如下图所示。

Click the Generate Columns Now button 8

单击“立即生成列”按钮以生成透视列。这些生成的列会自动添加到“现有透视输出列”区域。

Generate Output Column Result 9

单击“生成输出列结果”窗口中的“确定”以生成如上屏幕截图所示的输出列。

Pivot Transformation in SSIS 10

从上图可以看出,“现有透视输出列”区域为源数据生成了输出列 (C_2011_OrderQuantity、C_2012_OrderQuantity、C_2013_OrderQuantity 和 C_2014_OrderQuantity)。

单击“确定”。

现在,我们需要将输出列保存在数据库中。因此,将 OLE DB 目标从工具箱拖到数据流区域。接下来,将 SSIS 透视转换的输出箭头拖到 OLE DB 目标。

双击 OLE DB 目标,并提供所需信息,例如 SQL Server 名称、数据库和目标的表详细信息。

Select Destination Table 11

在这里,我们选择了数据库作为目标数据库,并选择了 [SSIS 中的透视转换] 表作为目标表。

单击“映射”选项卡以检查透视转换源列是否已映射到目标列。

Mapping available Input and Destination Columns

注意:如果您的输入和目标列名相同,智能映射会自动完成。如果列名有任何更改(别名或计算列),我们必须手动进行映射。

从上图可以看出,智能映射无法独立完成。因此,请正确映射。

Pivot Transformation in SSIS 13

单击“确定”以完成 SSIS 透视转换包的设计。让我们运行该包。

Pivot Transformation in SSIS 14

透视结果

让我们打开 SSMS 并编写以下查询以检查透视转换结果。

SELECT [Product Name]
     ,[2011]
     ,[2012]
     ,[2013]
     ,[2014]
FROM [PIVOT Transformation]
Destination Table 15

SSIS 2008 R2 中的透视转换

透视转换允许您对输入数据执行透视操作。在这里,我们将通过一个简单的例子来解释 SSIS 2008R2 中的透视转换,以便您更好地理解。

场景:我们希望使用 SSIS 2008 R2 中的透视转换来透视下表,以获得期望的输出。

打开 BIDS,将数据流任务从工具箱拖到控制流,并将其重命名为 SSIS 2008 r2 中的透视转换。

双击它,将打开 SQL Server Integration Services 的数据流选项卡。

将 OLE DB 源、透视转换和 OLE DB 目标从工具箱拖到数据流区域。

PIVOT TRANSFORMATION IN SSIS 2008 R2 2

双击数据流区域中的 OLE DB 源,将打开连接管理器设置,并提供编写语句的空间。

我们将用作 SSIS 透视转换源的 SQL 命令是:

SELECT PROD.ProductID,
       PROD.Name,
       YEAR(OrdHead.OrderDate) as OrderYear,
       SUM(Details.OrderQty) AS OrderQuantity

FROM Sales.SalesOrderDetail AS Details
     INNER JOIN
       Production.Product AS PROD ON
          Details.ProductID = PROD.ProductID
     INNER JOIN 
       Sales.SalesOrderHeader AS OrdHead ON
         Details.SalesOrderID = OrdHead.SalesOrderID
GROUP BY PROD.ProductID,
         PROD.Name,
         YEAR(OrdHead.OrderDate)
ORDER BY PROD.Name, 
         YEAR(OrdHead.OrderDate)

单击列选项卡以验证列。在此选项卡中,我们也可以取消选中不需要的列。

PIVOT TRANSFORMATION IN SSIS 2008 R2 4

单击“确定”并编辑 SSIS 2008 R2 中的透视转换。在“组件属性”选项卡中,我们可以更改名称,但暂时保留原样。

PIVOT TRANSFORMATION IN SSIS 2008 R2 5

转到“输入列”选项卡,选择从 OLE DB 源接收的所有输入列。

PIVOT TRANSFORMATION IN SSIS 2008 R2 6

转到 SSIS 透视转换的输入和输出属性选项卡,选择“透视默认输入”。在“输入列”下,您将找到在前一个选项卡中选择的所有列。您必须为每个输入列设置的唯一属性是 PivotUsage。

PIVOT TRANSFORMATION IN SSIS 2008 R2 7

它描述了您可以在 PivotUsage 属性中使用的值:

选项描述
0列值将传递给转换。
1设置键。所有具有相同设置键的列。
2这是透视列(这些列值将成为列名)。
3此列中的值放置在透视转换创建的新列中。

因此,在此示例中,每个输入列的 PivotUsage 属性将如下所示:

  • ProductID = 0
  • Name = 1
  • OrderYear = 2
  • OrderQuantity = 3

请注意,您的透视转换中至少必须有一个输入列的 PivotUsage 为 2,一个 PivotUsage 为 3,以及一个 PivotUsage 为 0 或 1。

PIVOT TRANSFORMATION IN SSIS 2008 R2 8

设置输入列后,转到“透视默认输出”,并在“输出列”下,使用“添加列”按钮添加这些列:ProductID、Name、2005、2006、2007、2008。

PIVOT TRANSFORMATION IN SSIS 2008 R2 9

ProductID 和 Name 列将显示来自 ProductID 和 Name 输入列的精确值。因此,将 ProductID 输出列的 SourceColumn 属性设置为 ProductID 输入列的 LineageID。

选择“输入列”下的 ProductID,并查看其 LineageID 值。

PIVOT TRANSFORMATION IN SSIS 2008 R2 10

从上图可以看出,202 是输入列的 LineageID。因此,将 ProductID 输出列的 SourceColumn 属性设置为从 ProductID 复制的 LineageID(即 202)。

PIVOT TRANSFORMATION IN SSIS 2008 R2 11

对 Name 列也执行相同的操作。

现在轮到透视列了,在“输出列”下选择 2005。这些列显示 2005 年的结果,因此在 PivotKeyValue 属性中输入 2005。

2005、2006、2007 和 2008 输出列的数据来自 OrderQuantity 输入列。因此,将 2005、2006、2007 和 2008 输出列的 SourceColumn 值设置为 OrderQuantity 输入列的 LineageID。

在此示例中,OrderQuantity 的 lineageID 为 211。

PIVOT TRANSFORMATION IN SSIS 2008 R2 12

因此,我们为 2005 输出列设置 SourceColumn 为 211,PivotKeyValue 为 2005。

PIVOT TRANSFORMATION IN SSIS 2008 R2 13

对于 2006 输出列,我们将 SourceColumn 设置为 211,PivotKeyValue 设置为 2006。

PIVOT TRANSFORMATION IN SSIS 2008 R2 14

对 2007 也执行相同的操作。

对于 2008 输出列,我们将 SourceColumn 设置为 211,PivotKeyValue 设置为 2008。

PIVOT TRANSFORMATION IN SSIS 2008 R2 16

目标表

接下来,我们需要将输出列保存在数据库中。因此,让我们配置 OLE DB 目标。为此,双击 OLE DB 目标,并提供所需信息,例如服务器名称、数据库和目标表的详细信息。

PIVOT TRANSFORMATION IN SSIS 2008 R2 17

在这里,我们选择 Employees 数据库作为目标数据库,[Pivot table] 作为目标表。

单击“映射”选项卡以检查源列是否已正确映射到目标列。

单击“确定”以完成 SSIS 2008 R2 包的透视转换设计。让我们运行该包。

PIVOT TRANSFORMATION IN SSIS 2008 R2 19

让我们打开 SSMS 并检查 2008 的透视转换结果。

评论已关闭。