我有一张Excel表格,如下所示:
+---------+----------------+
| ItemNum | Substitutes |
+---------+----------------+
| ABCD | XXXX/YYYY/ZZZZ |
| PQRS | AAAA/BBBB/CCCC |
+---------+----------------+
我需要以下列方式将其加载到MS Access或SQL Server中的表中:
+---------+------------+
| ItemNum | Substitute |
+---------+------------+
| ABCD | XXXX |
| ABCD | YYYY |
| ABCD | ZZZZ |
| PQRS | AAAA |
| PQRS | BBBB |
| PQRS | CCCC |
+---------+------------+
请告知如何做到这一点。我知道有一种方法可以使用Excel VBA执行此操作。但我正在寻找宏 - 免费的选项,其中文件原样可以加载到临时表,然后使用SQL,它可以以所需的形式获得。
答案 0 :(得分:3)
按原样导入数据,然后您可以使用此查询将其拆分:
SELECT T1.ItemNum, T2.mySplits as Substitute
FROM
(
SELECT *,
CAST('<X>'+replace(T.Substitutes,'/','</X><X>')+'</X>' as XML) as my_Xml
FROM Table1 T
) T1
CROSS APPLY
(
SELECT my_Data.D.value('.','varchar(50)') as mySplits
FROM T1.my_Xml.nodes('X') as my_Data(D)
) T2
这是一个Sql小提琴:http://sqlfiddle.com/#!6/042da/2
答案 1 :(得分:3)
您应采用临时表方法。因为您为SQL Server和Access都标记了这个,所以这里有两个选项。
如果您知道代码的长度始终相同,则将数据放入临时表中并使用以下内容提取:
select ItemNum, substring(substitutes, 1, 4) as substitute
from staging
where substitutes is not null
union all
select ItemNum, substring(substitutes, 6, 4) as substitute
from staging
where substitutes like '%/%'
union all
select ItemNum, substring(substitutes, 10, 4) as substitute
from staging
where substitutes like '%/%/%'
等等。这是有意编写的,可以很容易地修改为在MS Access中运行。
第二种选择类似,但在Excel中进行旋转。使用数据 - &gt;文本到列将数据拆分为单独的列。然后,将它们加载到包含substitute1
等列的表中,依此类推。然后,您需要一个类似的查询:
select ItemNum, substitute1 as substitute
from staging
where substitute1 is not null
union all
select ItemNum, substitute2 as substitute
from staging
where substitute2 is not null
union all
select ItemNum, substitute3 as substitute
from staging
where substitute3 is not null
再次,此查询有意与SQL Server和MS Access兼容。
答案 2 :(得分:1)
上面有一个SQL查询用于导入,应该是首选方法。如果要在工作表中尝试基于公式的解决方案,请尝试使用此公式对。
D2:E2的公式是,
=OFFSET($A$2, INT((ROW(1:1)-1)/3),0)
=MID(OFFSET($A$2, INT((ROW(1:1)-1)/3), 1), MOD((ROW(1:1)-1)*5+1,15), 4)
根据需要填写。这可能是一次性解决方案。