我有3个mysql
表,如下所示:
- product(product_id, product_name)
- order(order_id, order_date)
- order_detail(order_detail_id, product_id, order_id, quantity)
我想了解过去三个月每月销售的产品数量的平均值,并按产品分组
我想选择所有产品(过去三个月内是否销售)。
product_name | avg_quantity_sold_per_month
--------------|-----------------------------
product_1 | 50
product_2 | 0
product_3 | 78
我尝试了这个查询:
select
p.product_name
, sum(od.quantity)/3 as avg_quantity_sold_per_month
from order o
inner join order_detail od on o.order_id = od.order_id
inner join product p on od.product_id = p.product_id
where
o.order_date >= now()-interval 3 month
group by p.product_id
但它只显示最后几个月销售的产品,我想选择所有产品。
答案 0 :(得分:0)
使用left join
:
select p.product_name,
sum(od.quantity) / 3 as avg_quantity_sold_per_month
from product p
left join order_detail od on od.product_id = p.product_id
left join orders o on o.order_id = od.order_id
and o.order_date >= now() - interval 3 month
group by p.product_id
另外,尽量不要使用order
之类的保留关键字作为标识符。
答案 1 :(得分:0)
如果您想要所有产品,则需要left join
:
select p.product_name,
sum(od.quantity) / 3 as avg_quantity_sold_per_month
from product p left join
order_detail od
on od.product_id = p.product_id left join
orders o
on o.order_id = od.order_id and
o.order_date >= now() - interval 3 month
group by p.product_name;
使用left join
,您可以从要保留的表开始。 (right join
将重要信息留在 last 表格中,这更难以遵循。 where
条件需要移至on
子句,因此不会过滤掉不匹配的产品。
请注意,我还更改了group by
键以匹配所选的键。这是一种最佳做法。