MS Access 使用变量取消透视 100 多个列

MS Access using variables to unpivot 100+ columns

我有一个枢轴 table 看起来像这样(无法更改 table 布局),其中有 200 列要取消透视(字段名确实是数字)

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

table 应该是这样的:

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

有 200 列要逆透视,我无法理解使用 200 个 UNION ALL 创建 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

提前致谢!

您的 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