【问题标题】:Group by on two tables and perform Left join on outcome VBA ADODB SQL Query对两个表进行分组并对结果 VBA ADODB SQL 查询执行左连接
【发布时间】:2019-02-05 13:01:19
【问题描述】:

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

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

     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 步来完成 @987654326 @、LEFT JOINs 和 WHERE 组合。这就是我现在卡住的地方。

【问题讨论】:

    标签: sql excel database vba adodb


    【解决方案1】:

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

    您的 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] in the first chunk.

    尝试像这样修复 SQL 语法,看看你会得到什么。

    【讨论】:

    • 我已经修复了逗号问题。我现在设法执行 1 个条件的查询。现在我想取中间对象来执行下一个条件。在那部分面临问题。我应该更新代码吗?
    • 仔细查看我提供的语法示例。子查询需要用括号括起来并分别别名。您仍在尝试执行 SELECT * FROM Table1 INNER JOIN SELECT Field FROM Table2 ON Table1.Field = Table2.Field 当它需要 SELECT * FROM Table1 INNER JOIN (SELECT Field FROM Table2) T2 ON Table1.Field = T2.Field
    • 是的,现在我有 T1 和 T2。如果我在使用 T1 和 T2 时执行 UNION,我会收到“..找不到对象 T1.txt”错误。如何在不再次执行 group by 的情况下执行 UNION 访问 T1 和 T2?
    • 在没有看到 SQL 的情况下从该描述中进行调试真的很困难。一般来说,最好提供示例数据和您的预期结果,而不是 SQL 和错误消息。
    • 最好更新代码。这是一个很好的指南 - spaghettidba.com/2015/04/24/… 关键要点是格式良好的文本中的示例数据,转换的预期结果也是格式良好的文本。然后您可以在查询中发布您当前的尝试。
    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2020-02-15
    • 1970-01-01
    相关资源
    最近更新 更多