Sql 在Access中将分隔的条目拆分为新行

Sql 在Access中将分隔的条目拆分为新行,sql,ms-access,vba,delimiter,Sql,Ms Access,Vba,Delimiter,所以有人给了我一个订单的电子表格,每个订单的唯一值是PO,给我电子表格的人是懒惰的,他们决定订单有多个PO,但相同的信息,他们只是用“/”分开。例如,我的桌子看起来像这样 PO Vendor State 123456/234567 Bob KY 345678 Joe GA 123432/123456 Sue CA 234234 Mike CA 我希望做的是使用“/”符号作为分隔符来分隔PO,所

所以有人给了我一个订单的电子表格,每个订单的唯一值是PO,给我电子表格的人是懒惰的,他们决定订单有多个PO,但相同的信息,他们只是用“/”分开。例如,我的桌子看起来像这样

PO             Vendor   State
123456/234567  Bob      KY
345678         Joe      GA
123432/123456  Sue      CA
234234         Mike     CA
我希望做的是使用“/”符号作为分隔符来分隔PO,所以看起来像这样

    PO         Vendor   State
123456         Bob      KY
234567         Bob      KY
345678         Joe      GA
123432         Sue      CA
123456         Sue      CA
234234         Mike     CA
现在,我一直在集思广益,想办法解决这个问题。最终,我希望访问这些数据。原始格式的数据在Excel中。我想做的是在Access中编写一个vba函数,可以与SQL语句结合使用来分隔这些值。我现在很挣扎,因为我不知道从哪里开始

在Excel中,尝试以下操作:

IF(ISERROR(FIND("/",A1,1))=TRUE,A1, Left(A1, 6))
在它旁边的单元格中,放置如下内容:

IF(ISERROR(FIND("/",A1,1))=TRUE,"", Right(A1, 6))
这将把你的采购订单分成两列。从那里,写一个循环,在适当的地方创建一个新记录。

关于此:

1) 将源数据导入名为SourceData的新访问表

2) 创建新查询,直接进入SQL视图并添加以下代码:

SELECT * INTO ImportedData
FROM (
  SELECT PO, Vendor, State
  FROM SourceData
  WHERE InStr(PO, '/') = 0
  UNION ALL
  SELECT Left(PO, InStr(PO, '/') - 1), Vendor, State
  FROM SourceData
  WHERE InStr(PO, '/') > 0
  UNION ALL
  SELECT Mid(PO, InStr(PO, '/') + 1), Vendor, State
  FROM SourceData
  WHERE InStr(PO, '/') > 0) AS CleanedUp;
这是Access术语中的“make table”查询(尽管是嵌套的联合查询);对于“append”查询,将顶部的两行改为

INSERT INTO ImportedData
SELECT * FROM (
(其余部分不变。)区别在于,重新运行make table查询将清除目标表中已有的内容,而append查询将添加到任何现有数据中


3) 运行查询。

如果必须这样做,我会这样做

  • 将原始数据导入名为[Expertable]的表中
  • 使用“仅结构”选项将[TENTRABLE]复制到名为[ActualTable]的新表中
然后,在VBA例程中,我将

  • 打开两个DAO记录集,
    rstIn
    用于[Tentable]和
    rstOut
    用于[ActualTable]
  • 循环浏览
    rstIn
    记录集
  • 使用VBA
    Split()
    函数将“/”上的[PO]值拆分为一个数组
  • 对于每个
    数组项,我将使用
    rstOut.AddNew
    将记录写入[ActualTable]

您可以用几种不同的语言来完成这项工作,但基本上是在vba循环行中打开excel文件。每行检查采购订单是否包含斜杠。若并没有,那个么将新记录插入到数据库表中。如果是,请将PO字符串拆分为两部分,然后为每个部分插入一条记录。(如果可以)始终导入“干净数据”。Ie最好先在excel中清理文件,然后将其导入Access。我同意@johnnybones的建议,在PO中是否总是最多有2个值?你能拥有更多吗:123456/234567/987654@HansUp不,在你的例子中,有时会有三到四个PO。在这种情况下,我认为Gord的答案是你最好的选择,因为它提供了你需要的灵活性——它可以处理每个PO两个以上的值。