【问题标题】:SQL joining 2 tables with some overlapping valuesSQL 连接 2 个具有一些重叠值的表
【发布时间】:2013-09-29 11:43:10
【问题描述】:

我正在尝试从以下 2 个表中创建一个表并遇到很多问题。

表1有以下内容:

Month,
Salesperson_Assigned,
Product1_Revenue

表2有以下(不同的产品):

Month,
Salesperson_Assigned,
Product2_Revenue

问题在于,虽然所有月份都相同,但表 1 中有一些销售人员不在表 2 中,反之亦然。显然收入不同。我想加入表格,使其看起来像 Month、Salesperson、Product1_revenue + Product2_revenue。

这是我正在使用的查询:

SELECT
Table1.month,
Table1.salesperson_assigned,
sum(Table1.revenue + Table2.revenue)

FROM
Table1
INNER JOIN Table 2 ON (Table1.month = Table2.month) AND (Table1.salesperson_assigned = Table2.salesperson_assigned)

即使我确认每个表格中的收入值都是正确的,输出也不正确。对于应该为空的字段仅出现在 1 个表中的销售人员,输出似乎构成了附加值。

任何人都对如何正确连接这 2 个表有任何建议,因此它的行为类似于数据透视表,将唯一值添加到“已分配销售人员”列并添加两个列的收入,但是当销售人员仅在一张表是否尊重收入为零?

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    你试过这样吗:

     SELECT
        Table1.month,
        Table1.salesperson_assigned,
        sum(Table1.revenue + Table2.revenue)
    
        FROM
        Table1 FULL OUTER JOIN Table2 on (Table1.month = Table2.month AND Table1.salesperson_assigned = Table2.salesperson_assigned)
    

    【讨论】:

      【解决方案2】:

      理想情况下FULL OUTER JOINS 对这些类型的情况很有用 - 但显然 MySQL 不支持 FULL OUTER JOINS 请参阅:Full Outer Join in MySQL

      更新(不使用右外连接):

      create table table1
      (month int
      ,salesperson_assigned int
      ,Product1_revenue int);
      
      create table table2
      (month int
      ,salesperson_assigned int
      ,Product2_revenue int);
      
      
      insert into table1 values(1,10,100);
      insert into table1 values(2,10,200);
      insert into table1 values(1,11,40);
      insert into table1 values(2,11,800);
      insert into table1 values(3,11,400);
      
      
      insert into table2 values(1,10,100);
      insert into table2 values(2,10,200);
      insert into table2 values(1,12,40);
      insert into table2 values(2,12,200);
      
      select 
      table1.month
      ,table1.salesperson_assigned
      ,ifnull(table1.Product1_revenue,0) as Product1_revenue
      ,ifnull(table2.Product2_revenue,0) as Product2_revenue
      ,ifnull(table1.Product1_revenue,0)+ifnull(table2.Product2_revenue,0) as total_revenue
      from table1
      left outer join table2
      on table1.salesperson_assigned=table2.salesperson_assigned and table1.month=table2.month
      union 
      select 
      table2.month
      ,table2.salesperson_assigned
      ,ifnull(table1.Product1_revenue,0) as Product1_revenue
      ,ifnull(table2.Product2_revenue,0) as Product2_revenue
      ,ifnull(table1.Product1_revenue,0)+ifnull(table2.Product2_revenue,0) as total_revenue
      from table2
      left outer join table1
      on table2.salesperson_assigned=table1.salesperson_assigned  and table1.month=table2.month
      order by 2,1;
      

      返回:

      Month   salesperson_assigned    Product1_revenue    Product2_revenue    total_revenue
      1       10                          100                 100                 200
      2       10                          200                 200                 400
      1       11                          40                  0                   40
      2       11                          800                 0                   800
      3       11                          400                 0                   400
      1       12                          0                   40                  40
      2       12                          0                   200                 200
      

      ps:请考虑发布代码以重现您的数据,以便您获得更快的响应。

      【讨论】:

      • 我公司运行的mysql变种不允许右外连接,只能合并连接。将右外连接替换为合并连接有效吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 2020-06-23
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      相关资源
      最近更新 更多