【发布时间】:2016-07-15 15:45:12
【问题描述】:
我们在工作中无法访问 SQL 服务器,因此我必须在 Excel VBA 中设计一个应用程序并使用文本文件 (CSV) 来存储数据。
我在查询数据、加入 CSV 时没有问题,但我想使用 SQL Pivot/Unpivot 语句将其中一列转换为行。我不确定该功能是否存在,因为我不断收到 FROM 子句中存在语法错误的错误。
Public Function getData() As ADODB.Recordset
Dim path As String, conn As ADODB.Connection, rs As ADODB.Recordset
path = ThisWorkbook.path & "\"
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset
conn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & path & ";" & _
"Extended Properties=""text; HDR=Yes; FMT=Delimited; IMEX=1;""")
rs.ActiveConnection = conn
rs.Source = "SELECT * " & _
"FROM " & _
"(SELECT emp_id, client, allocation " & _
"FROM ALLOCATIONdb.csv) AS s " & _
"PIVOT (SUM(allocation) FOR client IN (client1, client2)) AS pvt"
Set getData = rs
End Function
My data currently looks like the top of the picture and I want it to look like the bottom.
使用数据透视表很简单,但我希望用户能够输入数据。
此外,是否有使其动态化,因为可能的客户端数量未知,因此需要扩展行数。
提前致谢
【问题讨论】:
-
您怀疑 Pivot 功能在 Jet 中不可用。您可以通过搜索找到替代方案。我认为他们通常在 VBA 中使用 UNION ALL 和循环。我有一个帖子可以做到这一点:yoursumbuddy.com/data-normalizer-the-sql
-
@DougGlancy 在 Jet 中有一个支点(实际上比 SQL 服务器早几年),但 OP 需要使用 TRANSFORM 关键字。例如stackoverflow.com/a/8975437/119477
-
转换效果很好,谢谢!
-
@ConradFrix,很高兴知道!
-
@user2476784 您应该添加您的解决方案作为答案。我尝试让转换工作,但我不能