我的桌子看起来像这样
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()的其他数据。
我需要一个查询,因此以后每一列都可以排序。 我很乐意提供任何帮助。最好的问候
答案 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