Как суммировать две таблицы с объединением без дубликатов данных? - PullRequest
0 голосов
/ 02 февраля 2020

Я не могу правильно сделать СУММУ между двумя таблицами, и я не понимаю причину. Если кто-нибудь поможет мне, я буду очень признателен.

У меня первый простой запрос, он работает хорошо. Результат для 22/01/2020 - Стоимость = "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, меняя ON с помощью USING ... и это не работает.

Я пытался объединить обе таблицы без SUM, и это работает хорошо. Я получаю информацию, и я могу объединить больше столбцов из обеих таблиц.

Что я делаю, чтобы получить ошибку в SUM?

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 02 февраля 2020

Это проблема кардинальности. У вас больше, чем одна запись на группу в обеих таблицах, поэтому в результате одно и то же значение суммируется более одного раза. Вы можете продемонстрировать проблему, выполнив запрос объединения без агрегирования.

Типичным решением является агрегирование в подзапросах, а затем объединение:

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


0 голосов
/ 02 февраля 2020

Я решил свою проблему. Я копирую код здесь только на тот случай, если он кому-нибудь понадобится.

спасибо.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...