我有一个具有这种结构的表格(“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多个记录。
答案 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