MS Access使用变量来取消100+列的拆分

时间:2017-12-13 17:00:32

标签: ms-access unpivot

我有一个看起来像这样的数据透视表(表格布局无法更改),有200列不透露(字段名称确实是数字)

Template | Row | 1 | 2 | 3 | 4 | ...| 200
abc      | 1   | 5 | 4 |   |   |    |     
abc      | 2   |   | 45|   |   |    |  
abc      | 3   |   | 35|   |   |    |  

表格应如下所示:

Template | row | column | value |
abc      |  1  |  1     |    5  |   
abc      |  1  |  2     |    4  |
abc      |  2  |  1     |       |
abc      |  2  |  2     |   45  |      

有200列不透明,我无法用200 UNION ALLs创建一个SQL语句,所以我想我会使用变量循环插入。

我遇到的困难是我不知道如何将变量用作值和字段名。 在Pseudo-SQL中,我的查询看起来像这样:

Insert Into TheDestination (Template, Row, Column, Value) Select Template, 
Row, $x as column, TheTable.$x from TheTable

其中X将在每次迭代时增加1。

这是我提出的,但我收到语法错误。什么是正确的陈述?我需要使用第二个变量吗?

Private Sub Unpivot_Click()
Dim x As Integer
Dim columncount As Integer
Dim setRST As DAO.Recordset
Dim sqlstr As String

Set setRST = CurrentDb.OpenRecordset("Select * from TheTable")
columncount = setRST.Fields.Count

While Not setRST.EOF
For x = 1 To columncount
CurrentDb.Execute "Insert Into TheDestination VALUES (Template, Rownumber, 
Columnnumber, Result) Select Template, row, "&x&" as column, "&x&" from 
TheTable"

Next x
Wend
End Sub

提前谢谢!

1 个答案:

答案 0 :(得分:2)

您的INSERT INTO语句看起来很奇怪,看起来您没有分配正确的值。

使用querydef和参数可以避免字符串连接问题,并最大限度地减少一些分配。

尝试以下方法:

Private Sub Unpivot_Click()
    Dim x As Integer
    Dim columncount As Integer
    Dim setRST As DAO.Recordset
    Dim sqlstr As String
    Dim qdf As DAO.QueryDef
    Dim fld As DAO.Field

    Set setRST = CurrentDb.OpenRecordset("Select * from TheTable")
    columncount = setRST.Fields.Count
    Set qdf = db.CreateQueryDef ("", "Insert Into TheDestination ([Template], [Row], 
    [Column], [Result]) VALUES (@Template, @RowNumber, @ColumnNumber, @Result)")
    Do While Not setRST.EOF
       qdf.Parameters("@Template") = setRST!Template
       qdf.Parameters("@RowNumber") = setRST!row
       For Each fld In setRST.Fields
           If IsNumeric(fld.Name) Then
                qdf.Parameters("@ColumnNumber") = fld.Name
                qdf.Parameters("@Result") = fld.Value
                qdf.Execute 
           End If
       Next fld
       setRST.MoveNext
    Loop

End Sub