mysql - 如何通过左连接合并2个表中的数据,形成聚合而不重复记录

标签 mysql sql

现在我正在处理 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

可以这样做吗?如果是的话我该怎么做? 非常感谢您提前的帮助!

最佳答案

您可以在单独的子查询中执行每个表的聚合:

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 表包含所有营销事件的数据。如果没有,那么您可能必须加入包含所有发生的事件的第三个表。实际上,可以说这样的表应该已经存在。

关于mysql - 如何通过左连接合并2个表中的数据,形成聚合而不重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49645696/

相关文章:

php - Magento 集合过滤功能

php - SQL,将 varchar(255) 转换为 mediumint

mysql - Unknown column in field list报错Rmysql

SQL:统计过去一周有事件的用户

sql - 使用 SQL 定义一对多关系

mysql - 以下两个条件有什么区别? 1. 其中 ABC> ='00' 且 ABC< ='ZZ' 2. 其中 ABC> ='0' 且 ABC< ='Z'

php - 将 PHP 数组的内容存储在 MySQL 数据库中

sql - 使用 SQL 获取每小时统计信息

sql - 在 postgres 中两个表之间的联接、聚合和转换

sql - 如何对 string_agg() 的结果进行排序