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
我有一个枢轴 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