我有一个从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
在上面的示例中,F1
,F2
是表格的列。但是ColA
,ColB
是数据的实际列标题,Week1
,Week2
不断变化
我需要将上述数据转换为以下格式:
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。但是我无法获得所需的输出而且我被卡住了。任何人都可以指导我一个方法,以便我可以进一步实施解决方案吗?
答案 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对此问题的分析。