将整个数据行转换为 SQL 中的列 header 或使用 SSIS
Convert entire data row into column header in SQL or using SSIS
我有一个从 excel 动态创建的 table,示例如下所示
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
是table的列。但是 ColA
、ColB
是数据的实际列 header,并且 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
我为暂存 table 中的每一行生成了一个唯一 ID,并分别标识了 header 和数据行。然后我尝试在 SQL 和 SSIS 甚至动态 SQL 中使用 unpivot。但是我无法获得所需的输出并且我被卡住了。任何人都可以指导我一种方法,以便我可以进一步实施解决方案吗?
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
输出:
ColA ColB ColC week_no quantity
----- ------- ------- -------- -----------
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
我创建了一个存储过程,它使用游标遍历我的第一个分段 table 的列,并创建了另一个转换后的 table。此 table 具有实际列 headers,在我之前的暂存 table.
中作为数据行存在
然后我使用 SQL unpivot 转置我的数据。
感谢@Prabhat G 对这个问题的分析。
我有一个从 excel 动态创建的 table,示例如下所示
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
是table的列。但是 ColA
、ColB
是数据的实际列 header,并且 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
我为暂存 table 中的每一行生成了一个唯一 ID,并分别标识了 header 和数据行。然后我尝试在 SQL 和 SSIS 甚至动态 SQL 中使用 unpivot。但是我无法获得所需的输出并且我被卡住了。任何人都可以指导我一种方法,以便我可以进一步实施解决方案吗?
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
输出:
ColA ColB ColC week_no quantity
----- ------- ------- -------- -----------
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
我创建了一个存储过程,它使用游标遍历我的第一个分段 table 的列,并创建了另一个转换后的 table。此 table 具有实际列 headers,在我之前的暂存 table.
中作为数据行存在然后我使用 SQL unpivot 转置我的数据。
感谢@Prabhat G 对这个问题的分析。