在MySQL上连接3个表以汇总产品的销售额和库存
我有三张桌子: 产品sku、价格、报价等 库存sku、分支机构、项目 销售供应商sku、项目、日期 表products包含有关产品的所有信息,库存或销售除外。当前库存存储在stock表中,并包含关于每个分支上有多少项可用的信息。表sales\u provider存储每个产品每天售出的商品数量。产品ID为sku 现在,我试图通过一个查询得到以下产品: 已产生销售的最佳利润数*报价 还有现货 当然,我想知道有多少商品还有存货,有多少商品已经售出 我正在尝试这样的查询:在MySQL上连接3个表以汇总产品的销售额和库存,mysql,sql,join,Mysql,Sql,Join,我有三张桌子: 产品sku、价格、报价等 库存sku、分支机构、项目 销售供应商sku、项目、日期 表products包含有关产品的所有信息,库存或销售除外。当前库存存储在stock表中,并包含关于每个分支上有多少项可用的信息。表sales\u provider存储每个产品每天售出的商品数量。产品ID为sku 现在,我试图通过一个查询得到以下产品: 已产生销售的最佳利润数*报价 还有现货 当然,我想知道有多少商品还有存货,有多少商品已经售出 我正在尝试这样的查询: select * fr
select
*
from
(
select
p.*,
sum(s.items) stock,
sum(sp.items) sales,
case when
p.priceOffer < p.price
and
p.priceOffer > 0
then
p.priceOffer
else
p.price
end finalPrice
from
products p
join
stock s
on
s.sku = p.sku
join
sales_provider sp
on
sp.sku = p.sku
group by
sku
) temp
where
stock > 0
order by
(finalPrice * sales) desc
limit 1;
但我有问题。基本上,我得到的是大量库存商品和销售供应商商品,而不是实际数量。而且,这是一个缓慢的查询,只需9500种产品,大约需要半秒钟
我一直在尝试修改它,我怀疑子查询是否有必要,但我就是不能确定它
如果有人能帮我改进并得到正确的结果,我将非常感激
提前感谢您的宝贵意见
Francisco对于这种类型的查询,您需要分别对库存和销售提供商进行聚合。否则,您将在给定项的两个表之间生成笛卡尔积 试试这个:
select p.sku, (salesitems*offeredprice) as profit, stockitems, salesitems
from products p left join
(select sku, SUM(items) as stockitems
from stock
group by sku
) s
on p.sku = s.sku left join
(select sku, SUM(items) as salesitems
from sales_provider sp
group by sku
) sp
on p.sku = sp.sku
where p.stockitems > 0
order by profit desc
这假设productsku是唯一的。您正在寻找的产品带来了最多的总收入,对吗?要计算利润,你需要成本信息。@OllieJones:是的,没错。我在查询中不考虑原始成本的原因是所有产品都有10%的固定利润。无论什么时候有价格优惠,它只是提供信息,但这是一个来自供应商的优惠,它仍然有10%的相同利润。太好了。非常感谢。现在数据正确,查询时间为原始时间的30%:-