访问查询或VBA - 将数据拆分为行级别

时间:2014-07-25 17:18:04

标签: sql ms-access access-vba ms-access-2010

我如何获得以下

项目|代码1 |代码2 |代码3

1 | a | b | ç

2 | a | d

转换为按项目在线级获取代码?

项目|代码

1 |一个

1 | B'/ P>

1 | ç

2 |一个

2 | d

我目前正在手动执行此操作,但问题是我有30个代码。我当前的进程是执行选择查询,然后为所有30个代码执行联合。有人可以帮我解决这个问题吗?我知道vba脚本可以完成这项工作,但不知道如何做到这一点。谢谢!

2 个答案:

答案 0 :(得分:1)

使用此功能,您可以从包含名为(code1,code2,...,codeN)的N个代码字段的表中读取数据,并将它们写入只包含两个字段的表中:

Function Verticalize(numberofcodes As Integer)
        Dim sql As String
        Dim rst As New ADBDb.Recordset
        sql = "SELECT * FROM tname"
        rst.Open sql, CurrentProject.AccessConnection
        While Not rst.EOF
            For i = 1 To numberofcodes
                DoCmd.RunSQL "insert into tdest values (" & rst(0) & "," & rst("code") & Str(i) & ")"
            Next i
            rst.MoveNext
        Wend
End Function

答案 1 :(得分:1)

您可以通过创建新表来支持任意数量的项目代码,我们称之为ProjectCode

所以你有Projects的一个表,它与代码没有任何关系。 如果代码附加了额外数据,您可以创建Code表并添加该信息。

ProjectCode通过使用JOIN帮助数据库查看它们的相关性。结构将是

ProjectID | CodeID

我为此类案例所做的是使用项目的主表单,并在数据表视图中以连续形式作为子表单,链接到ProjectCode - 表,并链接ID从项目到子窗体的ProjectID。 (子窗体对象的Link Master Fields& Link Child Fields属性),请注意您要在子窗体上隐藏ProjectID。

要获取代码列表,您只需使用项目ID查询ProjectCode即可。如果您需要项目中的其他信息,请使用联接:

SELECT * FROM Projects INNER JOIN ProjectCode ON ProjectCode . ProjectID = Projects.ID
WHERE ID = 'some id'

请注意,每个代码都会重复来自Projects的信息。