我有一个看起来像这样的数据透视表(表格布局无法更改),有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
提前谢谢!
答案 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