如何在没有重复数据的情况下对两个具有连接的表进行求和?

Posted

技术标签:

【中文标题】如何在没有重复数据的情况下对两个具有连接的表进行求和?【英文标题】:How can I SUM two tables with a join without duplicate data? 【发布时间】:2020-02-02 09:54:28 【问题描述】:

我无法在两个表之间正确地求和,我不明白原因。如果有人帮助我,我会非常感激。

我的第一个查询非常简单,效果很好。 2020 年 1 月 22 日的结果是 Cost="252.263602"。这是正确的答案。

SELECT
  Date,
  AdGroupId,
  SUM(A1.Cost)/1000000 AS Cost
FROM
  `table` A1
GROUP BY
  1, 2
ORDER BY
  Date DESC

但我需要将这张表与另一张表合并以获取更多信息。为此,我有以下查询:

SELECT
  A1.Date,
  A1.AdGroupId,
  SUM(V1.VideoViews) AS VideoViews,
  SUM(A1.Cost)/1000000 AS Cost
FROM
  `table` A1
INNER JOIN
  `table2` V1
ON
 (A1.Date = V1.Date
 AND A1.AdGroupId = V1.AdGroupId)
GROUP BY
  1, 2
ORDER BY
  Date DESC

2020 年 1 月 22 日的结果如何?成本 = “1009.054408”。错了……

我尝试了不同的 JOINS,用 USING 更改为 ON...但它不起作用。

我尝试在没有 SUM 的情况下加入两个表,并且效果很好。我得到信息,我可以从两个表中加入更多列。

我在做什么以得到 SUM 中的错误错误?

非常感谢!

【问题讨论】:

这涉及一个常见错误,人们想要一些连接,每个可能涉及不同的键,一些子查询,每个可能涉及连接和/或聚合,但他们错误地尝试完成所有连接然后全部聚合或聚合以前的聚合。在适当的行上编写单独的聚合和/或聚合一个案例语句选择行;加入常见的唯一列集。有时 DISTINCT 聚合可以在非键连接后选择正确的值。 PS 片段适用于 css/html/javascript。使用代码块。 PS 对于代码问题,请提供minimal reproducible example。 How to Ask 这能回答你的问题吗? sql sum data from multiple tables 这是一个常见问题解答。在考虑发布之前,请阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:***.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS我刚刚用“sql site:***.com before:2011”搜索了你的标题。 【参考方案1】:

这是一个基数问题。在两个表中,每个组的记录不止一条,因此相同的值被多次求和。您可以通过在没有聚合的情况下运行连接查询来展示该问题。

一种典型的解决方案是在子查询中聚合,然后加入:

SELECT
    A1.Date,
    A1.AdGroupId
    A1.Cost
    V1.VideoViews
FROM (
    SELECT
        Date,
        AdGroupId,
        SUM(Cost)/1000000 AS Cost
    FROM `table`
    GROUP BY 1, 2
) A1
INNER JOIN (
    SELECT
        Date,
        AdGroupId,
        SUM(VideoViews) AS VideoViews
    FROM `table2`
    GROUP BY 1, 2
) V1
    ON A1.Date = V1.Date
    AND A1.AdGroupId = V1.AdGroupId


【讨论】:

感谢您的帮助 GMB!我刚刚发布了解决方案。经过一段时间与代码的斗争,我找到了解决方案,呵呵,这是一个新手问题;) 如果我想用 SUM 聚合其他列,我只需要在最后一部分添加其他 JOIN,不是吗?谢谢!【参考方案2】:

我解决了我的问题。我把代码复制到这里,以防有人需要。

谢谢。

SELECT
  A1.Date,
  A1.AdGroupId,
  Cost,
  Views
FROM (
    SELECT
      Date,
      AdGroupId,
      SUM(Cost)/1000000 AS Cost
    FROM
      `table1`
      GROUP BY
      Date,
      AdGroupId) A1
  LEFT JOIN (
    SELECT
      Date,
      AdGroupId,
      SUM(VideoViews) AS Views
    FROM
      `table2`
       GROUP BY
      Date,
      AdGroupId) V1
ON
  A1.Date = V1.Date
  AND A1.AdGroupId = V1.AdGroupId
ORDER BY
  Date DESC

【讨论】:

以上是关于如何在没有重复数据的情况下对两个具有连接的表进行求和?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有任何重复行的情况下连接两个表中的表?

如何在不删除重复值的情况下对数据集进行分组

如何将不同数据上下文的表进行内部连接?[重复]

如何使用 SQL 和 Python 连接两个具有日期条件的表?

如何在没有评估环境的情况下对函数进行集群导出

如何在没有操作的情况下对 Pandas 数据框进行分组或聚合