在列上连接行(microsoff SSIS)

我有Excel文件包含这些信息

Contry | 2000 | 2001 | 2002 |2003 ---------------------------------- Tunisia | X1 | X2 | X3 |X4 ------------------------------------- Algeria | X21 | X22 | X23 |X24 ------------------------------------- 

我想这样的信息存储在数据库中

 Tunisia 2000 X1 -- Tunisia 2001 X2 -- Tunisia 2002 X3 -- Tunisia 2003 X4 -- Algeria 2000 X21 -- Algeria 2001 X22 -- Algeria 2002 X23 -- Algeria 2003 X24 

我正在使用SSIS,我是大多数组件的初学者。谢谢

如果您使用的是Excel 2010或更高版本,则可以使用Power Pivot或“ Data ►“ Get and Transform ►“ From TableUnPivot这些列。 然后按照你的意愿重新标记:

在这里输入图像说明

在这里输入图像说明

在这里输入图像说明

你可以加载数据,因为它是在一些临时表,然后unpivot并插入你需要的表:

 DECLARE @cols nvarchar(max) = '', @sql nvarchar(max) SELECT @cols = @cols + ','+QUOTENAME(name) FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('#temp') AND name != 'Country' SELECT @sql = N' INSERT INTO NewTable SELECT Country, [Year], [Values] FROM #temp UNPIVOT ( [Values] FOR [Year] IN ('+STUFF(@cols,1,1,'')+') ) unpvt' EXEC sp_executesql @sql 

输出将被插入:

 Country Year Values Tunisia 2000 X1 Tunisia 2001 X2 Tunisia 2002 X3 Tunisia 2003 X4 Algeria 2000 X21 Algeria 2001 X22 Algeria 2002 X23 Algeria 2003 X24 

注意:我使用dynamicSQL,因为我不确定input表中的列数(年)。 如果确定了列数 – 那么更好地将数据加载到临时表中,然后使用:

 INSERT INTO NewTable SELECT Country, [Year], [Values] FROM #temp UNPIVOT ( [Values] FOR [Year] IN ([2000],[2001],[2002],[2003]) ) unpvt 

或者还有一种方法是在Excel中使用pivoting并将其结果加载到目标表(在我的示例中为NewTable )。 这在@RonRosenfeld提供的答案中显示。