通过Excel VBA上的查询字符串执行SQL过程代码(查询表相同的工作簿)

时间:2017-07-28 18:47:26

标签: sql excel vba ado

使用SQL的新手。我试图通过excel VBA通​​过查询字符串执行SQL代码,以测试存储在同一工作簿上的工作表中的表的动态数据透视查询。普通查询工作正常(SELECT),但SQL语句没有。

我一次又一次地收到Invalid SQL statement expected; 'DELETE','INSERT' ...错误

我想要实现的是一个用于检索动态数据透视的sql查询(行到变量列)。我不想用数据透视表来实现这一点我想用VBA的SQL字符串查询来实现它。

Sample data

如何做到这一点?

    On Error GoTo ErrorConexion
    objAdoConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
     "Data Source=" & ThisWorkbook.path & "\" & ThisWorkbook.Name & ";" & _
     "Extended Properties=""Excel 8.0;HDR=YES;FMT=Delimited; IMEX=1;"""

    strSQL = "SET NOCOUNT ON " & Chr(13) _
        &  "CREATE TABLE #tempdata(tmpf1 date, tmpf2 int)" _
        & " INSERT INTO #tempdata(tmpf1,tmpf2)" _
        & " SELECT [DATE], [AMOUNT] FROM " & GetTableRange(StrTable)

    On Error GoTo ErrorSQL
    objAdoRS.Open strSQL, objAdoConn

我想执行这样的代码:

DECLARE @Category AS VARCHAR(MAX)
SELECT @Category = 
    COALESCE(@Category + ', ', '') + CAST(Category AS VARCHAR(20)) 
    FROM (SELECT DISTINCT Category FROM mytable) Books
DECLARE @DynamicPIVOT AS VARCHAR(MAX)
SELECT @DynamicPIVOT = 'SELECT ' + @Category +
' FROM (
    SELECT amount, Category FROM mytable
) Books
PIVOT (
    MAX(amount) FOR Category IN (' + @Category + ')
) Result;'

EXEC (@DynamicPIVOT)

此致 文斯。

2 个答案:

答案 0 :(得分:0)

你尝试过这个吗?比创建临时表,插入和选择容易得多。您将通过一个select语句直接插入临时表。

  & "SELECT [DATE], [AMOUNT] INTO #TempData FROM " & 
  GetTableRange(StrTable) 

答案 1 :(得分:0)

只需使用JET/ACE SQL自己的crosstab query即可动态运行数据透视查询。

strSQL = "TRANSFORM MAX(t.[AMOUNT]) AS MaxAmount" _
           & " SELECT t.[DATE] " _
           & " FROM [SheetName$] t" _
           & " GROUP BY t.[DATE]" _
           & " PIVOT t.[PEOPLE]"

请注意:限制为255列。因此,如果 PEOPLE 超过254,则需要进行调整。