首页 > 解决方案 > 如何在没有重复数据的情况下对两个具有连接的表求和?

问题描述

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

我的第一个查询非常简单,效果很好。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

22/01/2020 的结果是什么?成本 = “1009.054408”。这是错的...

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

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

我在做什么才能在 SUM 中出现错误?

非常感谢!

标签: sqljoingroup-bygoogle-bigquerysum

解决方案


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

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

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



推荐阅读