在两个表上分组,并对结果VBA ADODB SQL查询执行左连接

时间:2018-08-30 14:27:00

标签: sql excel database vba adodb

我想对两个csv文件执行Group BY,然后通过Excel中的VBA ADO Query对两个表的结果执行Left Join。我的最终目的是打印记录集。

这是我到目前为止所做的。

     SELECT * FROM (
                   SELECT   f1.[c3],
                            f1.[c4],
                            f1.[c5],
                            f1.[c6],
                            Sum(f1.[c8]) AS SUMDATA
                   FROM     test1.csv F1 
                   GROUP BY f1.[c3],
                            f1.[c4],
                            f1.[c5],
                            f1.[c6]) AS f3
LEFT JOIN  SELECT * FROM   (
                SELECT   f2.[c3],
                         f2.[c4],
                         f2.[c5],
                         f2.[c6],
                         Sum(f2.[c8]) AS SUMDATA
                FROM     test2.csv f2
                GROUP BY f2.[c3],
                         f2.[c4],
                         f2.[c5],
                         f2.[c6]) AS f4
on  f3.[c3]+ f3.[c4]+ f3.[c5]+ f3.[c6] = f4.[c3]+ f4.[c4]+ f4.[c5]+ f4.[c6]
WHERE  f3.[SUMDATA] <> f4.[SUMDATA] 

这显示语法错误。如何实现呢?任何帮助深表感谢。 TIA。

更新-

我设法在2个表之间实现1 LEFT JOIN和2 GROUP BYs。根据要求,以下是有关我的数据集的一些详细信息。 它由字段-c1,c2 .... c8组成。 c8是我的目标领域。

我的预期输出-我不需要输出表中的c7,c1和c2。 c7,c1和c2的信息无关紧要。我需要对数据做5件事。

  1. 基于CSV文件1中的c3,c4,c5和c6字段对c8字段进行分组求和,并将目标字段存储为SUMDATA

  2. 基于CSV文件2中的c3,c4,c5和c6字段对c8字段进行分组求和,并将目标字段存储为SUMDATA

  3. 在CSV1和CSV2之间找到不匹配的SUMDATA字段条目(我在连接的c3,c4,c5,c6字段上为此使用了LEFT JOIN

  4. 查找CSV1中存在但CSV2中不存在的条目

  5. 查找CSV2中存在的条目,而CSV1中不存在

当前,我设法编写直到第3步为止的代码。我需要临时存储从第1步和第2步获得的分组表,以执行第4步和第5步,这可以再进行2步{{ 1}},UNIONLEFT JOINs的组合。这就是我现在停留的地方。

1 个答案:

答案 0 :(得分:3)

这并不是真正的答案,但是格式对于可读性很重要。

您的SQL似乎有很多错误。

语法应如下所示(假设查询csv的方式如您所想):

SELECT SUB1.Field1,
       SUB1.AggField AS Agg1,
       SUB2.AggField AS Agg2
  FROM (SELECT Field1,
               MAX(Field2) Agg_Field
          FROM Table1 T1
         GROUP
            BY Field1
       ) SUB1
  LEFT
  JOIN (SELECT Field1,
               MAX(Field2) Agg_Field
          FROM Table1 T2
         GROUP
            BY Field1
       ) SUB2
    ON SUB1.Field1 = SUB2.Field1
 WHERE SUB1.AggField <> SUB2.AggField;

此外,您在这里缺少逗号:第一个块中为F1。[c5] F1。[c6]。

尝试像这样修复SQL语法,看看能帮助您什么。