“INNER JOIN”和“LEFT JOIN”与“GROUP BY”

ABS*_*mon 0 mysql sql group-by left-join

我的桌子看起来像这样

sales
----------------------------------------------------------
id  ordernumber             quantity  category_id    price
1   402-9182243-8008368     1         3              22.95
2   406-3666671-8627555     2         3               6.95
3   303-1935495-5532309     1         1               7.95
4   171-5799800-1198702     1         2             159.95
5   403-2398078-4901169     2         2              18.95

category
--------------
id  name
1   bikes
2   shoes
3   planes

returns
--------------
id  ordernumber          quantity   costs
1   402-9182243-8008368  1          22.95   
2   402-9182243-8008368              5.95   // return shipping fee
Run Code Online (Sandbox Code Playgroud)

这是我的查询

    SELECT c.name,
           SUM(v.quantity) AS sold,               # wrong
           SUM(s.quantity * s.price) AS turnover, # wrong
           SUM(r.costs) AS returncosts,
      FROM sales AS s
INNER JOIN categories AS c ON c.id = s.category_id  
 LEFT JOIN returns AS r ON r.ordernumber = s.ordernumber 
  GROUP BY c.name
Run Code Online (Sandbox Code Playgroud)

我有一些带有聚合函数的内部联接。但我还需要“返回”和“左连接”(我认为)。有了 Left Join,我的聚合函数就不再起作用了。左连接添加额外的行。sum() 的附加数据。

我需要一个查询,因此每列都可以稍后排序。如果有任何帮助,我会很高兴。此致

spe*_*593 5

它是半笛卡尔积,因为订单号在退货表中不唯一。

如果我们删除聚合函数并返回详细信息行,我们可以看到会发生什么。

一种可能的方法是在内联视图中预先聚合返回值,以便返回 ordernumber 的唯一值。

假设 ordernumber 在 sales 表中是唯一的,则如下所示:

SELECT c.name
     , SUM(s.quantity)                  AS sold
     , SUM(s.quantity * s.price)        AS turnover
     , SUM(r.returncosts)               AS returncosts
  FROM sales s
  JOIN categories c
    ON c.id = s.category_id
  LEFT 
  JOIN ( SELECT t.ordernumber 
              , SUM(t.costs) AS returncosts
           FROM returns t
          GROUP
             BY t.ordernumber
       ) r 
    ON r.ordernumber = s.ordernumber
 GROUP
    BY c.name
Run Code Online (Sandbox Code Playgroud)