AccessTab中具有多个列标题的CrossTab

时间:2014-08-02 02:35:09

标签: sql vba ms-access crosstab

我有一个具有这种结构的表格(“Spot”是项目存储的地方,“N”是该地点的项目数量。)

Id | Spot1 | N1 | Spot2 | N2 | Spot3 | N3 |
1  |   A   | 2  |   B   | 2  |   C   | 1  |
2  |   B   | 2  |   C   | 1  |   D   | 2  |
3  |   A   | 2  |   C   | 1  |   D   | 5  |

我想在该表上运行查询并创建一个这样的表:

ID | A | B | C | D |
1  | 2 | 2 | 1 | _ |
2  | _ | 2 | 1 | 2 |
3  | 2 | _ | 1 | 5 |

我希望在决定构建此查询的最佳策略方面提供一些帮助。

我正在考虑使用不同的列标题创建几个交叉表查询,并以某种方式将这些交叉表表合并在一起。

这是一个好的方法还是更高效的东西。我的示例只有4个不同的项目,但我的实际表格大约有20个项目,因此最终的表格将有20个列和200多个记录。

1 个答案:

答案 0 :(得分:0)

我建议首先拼接,然后交叉涂抹。我们可以使用源ID,Spot和Amount的中间三列表来完成此操作。以下代码是一种通用方法,不会假设源表中有多少列。它也没有假设有多少斑点存在。它确实假设表tmpTbl已经存在。

Sub largeCrossTab()
    Dim rst As DAO.Recordset, rst2 As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("Table1")
    Dim fld As DAO.Field
    CurrentDb.Execute "DELETE FROM tmpTbl"
    For Each fld In rst.Fields
        If InStr(fld.Name, "Spot") > 0 Then
            CurrentDb.Execute "INSERT INTO tmpTbl(OrigID, Spot, Amount) " _
                & "SELECT ID, " & fld.Name & ", N" & Right(fld.Name, Len(fld.Name) - 4) _
                & " FROM Table1"
        End If
    Next
    Set rst2 = CurrentDb.OpenRecordset("TRANSFORM Nz(Sum(Amount), '_') " _
        & "SELECT OrigID " _
        & "FROM tmpTbl " _
        & "GROUP BY OrigID " _
        & "PIVOT Spot")

    ''' Do something with rst2 '''

    Set rst = Nothing
    Set rst2 = Nothing
    Set fld = Nothing
End Sub