Ms access 使用变量取消PIVOT 100+列的MS访问

Ms access 使用变量取消PIVOT 100+列的MS访问,ms-access,unpivot,Ms Access,Unpivot,我有一个透视表,看起来是这样的。表布局不能更改,有200列要取消插入。字段名实际上是数字 Template | Row | 1 | 2 | 3 | 4 | ...| 200 abc | 1 | 5 | 4 | | | | abc | 2 | | 45| | | | abc | 3 | | 35| | | | 该表应如下所示: Template | row | column | valu

我有一个透视表,看起来是这样的。表布局不能更改,有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  |      
Insert Into TheDestination (Template, Row, Column, Value) Select Template, 
Row, $x as column, TheTable.$x from TheTable
由于要取消插入200列,我无法理解如何创建一个包含200个UNION ALL的SQL语句,所以我想我将使用变量将insert循环到中

我遇到的困难是,我不知道如何将变量用作值和字段名。 在伪SQL中,我的查询如下所示:

Template | row | column | value |
abc      |  1  |  1     |    5  |   
abc      |  1  |  2     |    4  |
abc      |  2  |  1     |       |
abc      |  2  |  2     |   45  |      
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和参数可以避免字符串串联的问题,并最小化一些赋值

请尝试以下操作:

专用子解锁\单击 作为整数的Dim x Dim columncount为整数 Dim setRST作为DAO.Recordset 作为字符串的Dim sqlstr 将qdf设置为DAO.QueryDef 模糊fld为刀场 Set setRST=CurrentDb.OpenRecordsetSelect*从表格中选择 columncount=setRST.Fields.Count 设置qdf=db.CreateQueryDef,插入目标[模板],[行], [Column]、[Result]值@Template、@RowNumber、@ColumnNumber、@Result 不要在设置rst.EOF时执行此操作 qdf。Parameters@Template=setRST!样板 qdf。Parameters@RowNumber=setRST!一行 对于设置字段中的每个fld 如果是numericfld.Name,那么 qdf。Parameters@ColumnNumber=fld.Name qdf。Parameters@Result=fld.值 执行 如果结束 下一个fld setRST.MoveNext 环 端接头
INSERT INTO语句看起来很奇怪,而且似乎没有指定正确的值

使用querydef和参数可以避免字符串串联的问题,并最小化一些赋值

请尝试以下操作:

专用子解锁\单击 作为整数的Dim x Dim columncount为整数 Dim setRST作为DAO.Recordset 作为字符串的Dim sqlstr 将qdf设置为DAO.QueryDef 模糊fld为刀场 Set setRST=CurrentDb.OpenRecordsetSelect*从表格中选择 columncount=setRST.Fields.Count 设置qdf=db.CreateQueryDef,插入目标[模板],[行], [Column]、[Result]值@Template、@RowNumber、@ColumnNumber、@Result 不要在设置rst.EOF时执行此操作 qdf。Parameters@Template=setRST!样板 qdf。Parameters@RowNumber=setRST!一行 对于设置字段中的每个fld 如果是numericfld.Name,那么 qdf。Parameters@ColumnNumber=fld.Name qdf。Parameters@Result=fld.值 执行 如果结束 下一个fld setRST.MoveNext 环 端接头
您可能需要将字段名括起来,使其看起来像SQL中的[1]和[2]等等。或者更确切地说,使用DAO添加记录-这将比多个SQL调用快得多。您可能需要将字段名括起来,使其看起来像SQL中的[1]和[2]等等。或者更确切地说,使用DAO添加记录-这将比多个SQL调用快得多。谢谢,这正是我想要的!谢谢,那正是我想要的!