Как объединить данные в 2 таблицы, сформировать агрегацию без дублирования записи при левом соединении

0

Теперь я работаю с файлами SQL и задаю вопрос: я хотел бы рассмотреть влияние рекламной кампании на данные в файле sql. В файле SQL есть 2 таблицы, веб-трафик и рекламная кампания

Таблица веб-трафика, пусть скажем, веб-таблица выглядит следующим образом

visitor_id purchase date traffic_source campaign_name country purchase_value
     1        1/1/2018       Search      promotion101    US      100
     2        2/1/2018       Direct      voucher02       UK      110
     3        2/1/2018       Search      buyme01         US       50
     4        3/1/2018       Banner      Example01       DE      130
     ..        .......       ...          ...            ..      ...  

А во второй таблице у меня есть информация о кампании, скажем, продвижение по таблицам

Promotion_date campaign_name num_delivered promotion_fee 
  1/12/2017    promotion101      50           30
  2/12/2017    promotion101      30           20
  2/12/2017    voucher02         40           10
  3/12/2017    Example01         70           30
     ...             ...         ...          ...

В этом случае я попытался использовать левое соединение, чтобы сначала объединить таблицу, но запись дублировалась

Select 
   web.campaign_name, 
   sum(web.promotion_fee),
   sum(promotion.purchase_value)
FROM 
   web LEFT JOIN promotion 
   ON web.campaign_name = promotion.campaign_name 
GROUP BY 
   1

Однако это не работает, потому что левое соединение просто дублирует запись... В этом случае, если я хочу сформулировать таблицу следующим образом:

Campaign_name Traffic_source Total_Customer Total_purchase_value Total expenditure 
 promotion101   Search         1000           2000                 1500
 Example01      Banner         2000           3750                 3000

Можно ли это сделать? Если да, то как я могу это сделать? Большое спасибо за вашу помощь заранее!

  • 1
    откуда total_customer , Total_purchase_value Total expenditure значения Total expenditure ?
  • 0
    Переключитесь на GROUP BY web.campaign_name . (группировка по порядковому положению не является хорошей практикой программирования.)
Теги:

1 ответ

1
Лучший ответ

Вы можете отображать агрегаты каждой таблицы в отдельных подзапросах:

SELECT
    w.campaign_name,
    w.purchase_value AS Total_purchase_value,
    COALESCE(p.promotion_fee, 0) AS Total_expenditure
FROM
(
    SELECT campaign_name, SUM(purchase_value) AS purchase_value
    FROM web
    GROUP BY campaign_name
) w
LEFT JOIN
(
    SELECT campaign_name, SUM(promotion_fee) AS promotion_fee
    FROM promotion
    GROUP BY campaign_name
) p
    ON w.campaign_name = p.campaign_name;

Критическое предположение, которое я сделал здесь, состоит в том, что web таблица содержит данные для всех кампаний. Если нет, то вам, возможно, придется присоединиться к третьей таблице, содержащей все кампании, которые произошли. На самом деле, возможно, такая таблица уже должна существовать.

  • 0
    Это работает и большое спасибо! И еще одна вещь, в случае, если есть какие-то кампании, которые не включены в веб-таблицу, тогда мы должны присоединиться к другой третьей таблице. Но для последовательности в присоединяющейся таблице имеет значение, как я должен сначала присоединиться к дополнительной таблице, или это не очень важно?
  • 0
    Вот в чем дело: каждая таблица может иметь кампании, которые являются уникальными только для этой таблицы, поэтому вы не знаете, какой порядок использовать. Если это реальная проблема, то создайте таблицу кампаний.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню