将整个数据行转换为SQL中的列标题或使用SSIS

时间:2017-10-26 19:46:04

标签: sql ssis unpivot

我有一个从excel动态创建的表,一个样本看起来像这样

F1     F2     F3     F4    F5
ColA   ColB   ColC   Week1 Week2
1      Mango  Fruit  5     6
2      Potato Veg    4     3
3      Grapes Fruit  4     4

在上面的示例中,F1F2是表格的列。但是ColAColB是数据的实际列标题,Week1Week2不断变化

我需要将上述数据转换为以下格式:

ColA   ColB     ColC       Week      Qty
1      Mango    Fruit      Week1     5
1      Mango    Fruit      Week2     6
2      Potato   Veg        Week1     4
2      Potato   Veg        Week2     3
3      Grapes   Fruit      Week1     4
3      Grapes   Fruit      Week2     4

我为登台表中的每一行生成了一个唯一ID,并分别标识了标题和数据行。然后我尝试在SQL和SSIS甚至动态SQL中使用unpivot。但是我无法获得所需的输出而且我被卡住了。任何人都可以指导我一个方法,以便我可以进一步实施解决方案吗?

2 个答案:

答案 0 :(得分:1)

select * from ( select dm.*, mdm.ProductionSystem, mdm.SchoolIdent from DM_OLD.dbo.DimSchool dm inner join EDW_OLD.dbo.School edw on dm.EdwSchoolId = edw.SchoolID inner join MDM_OLD.dbo.School mdm on edw.SYS_BusinessKeyFK = mdm.SYS_BusinessKeyID ) a full outer join ( select dm.*, maps.ProductionSystem, maps.SchoolIdent from dm.dbo.DimSchool dm inner join edw.dbo.School edw on dm.EdwSchoolId = edw.SchoolID inner join edw.maps.School maps on edw.SYS_BusinessKeyFK = maps.SYS_BusinessKeyID ) b ON a.ProductionSystem = b.ProductionSystem AND a.SchoolIdent = b.SchoolIdent 至少不应成为问题。试试这个:

Unpivot

输出:

create table tbl(F1 varchar(20),F2 varchar(20),F3 varchar(20),F4 varchar(20),F5 varchar(20))
insert into tbl values
('ColA','ColB','ColC','Week1','Week2'),
('1','Mango'  ,'Fruit','5','6'),
('2','Potato' ,'Veg','4','3'),
('3','Grapes' ,'Fruit','4','4')


SELECT F1 as ColA, F2 as ColB, F3 as ColC,week_no, quantity 
FROM
    (SELECT F1, F2, F3, F4, F5
     FROM tbl) iq
    UNPIVOT
    (quantity FOR Week_no IN(F4, F5)
    ) As wk1
WHERE F1 not in ('ColA')  //to filter out header

答案 1 :(得分:0)

我创建了一个存储过程,利用游标迭代我的第一个临时表的列并创建另一个转换表。此表具有实际的列标题,这些标题在我以前的临时表中作为数据行出现。

然后我使用SQL unpivot来转置我的数据。

感谢@Prabhat G对此问题的分析。