通过Excel VBA上的查询字符串执行SQL过程代码(查询表相同的工作簿)
带SQL的新手。我试图通过Excel VBA通过查询字符串执行SQL代码,以测试存储在同一工作簿中工作表上的表中的动态数据透视查询。普通查询的工作正常(SELECT),但SQL语句没有。通过Excel VBA上的查询字符串执行SQL过程代码(查询表相同的工作簿)
我收到Invalid SQL statement expected; 'DELETE','INSERT'
...错误连连
我想要实现的是一个SQL查询来检索动态枢轴(行变量列)。我不想用透视表实现这一点,我想用VBA中的SQL字符串查询来实现。
如何才能做到这一点?
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)
问候, 文斯。
只需使用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,则需要进行调整。
真棒Partfait。它可以用“union all”声明来完成?我的意思是,首先合并来自多个表的所有数据,然后再交叉表,所有的数据都在同一个查询中。很多。 – Vince
我已经发现如何用UNION ALL做到这一点。在不使用存储过程的情况下制作数据透视动态查询的简单解决方案。我花了几个小时试图获得这些数据的观点。谢谢aagain。 – Vince
太好了,很高兴帮助!请记住,此交叉表查询只能使用Jet/ACE(MS Access dbs,Excel wbs)以及其他RDBMS(如SQL Server)。请接受此解决方案以确认解决方案(标记为边) - SO版本的“谢谢”! – Parfait
你试过这个吗?比创建临时表,插入和选择要容易得多。您通过一个select语句直接插入临时表。
& "SELECT [DATE], [AMOUNT] INTO #TempData FROM " &
GetTableRange(StrTable)
谢谢以赛亚,但它不起作用。 – Vince
您试图使用Jet/ACE复制SQL Server存储过程(一个错综复杂的动态数据透视表) - 有两种不同的SQL引擎和方言。另外,您不能像在存储过程中一样使用ADO在单个调用中发送多个SQL命令。请向我们展示数据和期望的输出。 – Parfait
谢谢Parfait,我在混合很多环境。我添加了示例数据。 – Vince