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

时间:2019-03-28 18:32:18

标签: 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

这是我的查询

    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

我有一些带有聚合函数的内部联接。 但是我还需要带有“左联接”的“返回”(我认为)。 并且使用Left Join,我的聚合函数不再起作用。 左联接添加其他行。有关sum()的其他数据。

我需要一个查询,因此以后每一列都可以排序。 我很乐意提供任何帮助。最好的问候

2 个答案:

答案 0 :(得分:4)

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

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

一种可能的方法是在嵌入式视图中预先汇总退货,以便返回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

答案 1 :(得分:1)

您可以将LEFT JOIN中与sub query分开的数量求和,如下所示:

SELECT t1.name, t1.sold, t1.turnover, SUM(r.costs) AS returncosts  
FROM(
   SELECT c.name,
       SUM(s.quantity) AS sold,                
       SUM(s.quantity * s.price) AS turnover 
  FROM sales AS s
 INNER JOIN categories AS c ON c.id = s.category_id 
 GROUP BY name
)  t1
LEFT JOIN returns AS r ON r.ordernumber = s.ordernumber 
GROUP BY t1.name, t1.sold, t1.turnover