2017-07-28 23 views
0

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

问候, 文斯。

+0

您试图使用Jet/ACE复制SQL Server存储过程(一个错综复杂的动态数据透视表) - 有两种不同的SQL引擎和方言。另外,您不能像在存储过程中一样使用ADO在单个调用中发送多个SQL命令。请向我们展示数据和期望的输出。 – Parfait

+0

谢谢Parfait,我在混合很多环境。我添加了示例数据。 – Vince

回答

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列的限制。因此,如果大于254,则需要进行调整。

+0

真棒Partfait。它可以用“union all”声明来完成?我的意思是,首先合并来自多个表的所有数据,然后再交叉表,所有的数据都在同一个查询中。很多。 – Vince

+0

我已经发现如何用UNION ALL做到这一点。在不使用存储过程的情况下制作数据透视动态查询的简单解决方案。我花了几个小时试图获得这些数据的观点。谢谢aagain。 – Vince

+0

太好了,很高兴帮助!请记住,此交叉表查询只能使用Jet/ACE(MS Access dbs,Excel wbs)以及其他RDBMS(如SQL Server)。请接受此解决方案以确认解决方案(标记为边) - SO版本的“谢谢”! – Parfait

0

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

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

谢谢以赛亚,但它不起作用。 – Vince