在MySQL上连接3个表以汇总产品的销售额和库存

在MySQL上连接3个表以汇总产品的销售额和库存,mysql,sql,join,Mysql,Sql,Join,我有三张桌子: 产品sku、价格、报价等 库存sku、分支机构、项目 销售供应商sku、项目、日期 表products包含有关产品的所有信息,库存或销售除外。当前库存存储在stock表中,并包含关于每个分支上有多少项可用的信息。表sales\u provider存储每个产品每天售出的商品数量。产品ID为sku 现在,我试图通过一个查询得到以下产品: 已产生销售的最佳利润数*报价 还有现货 当然,我想知道有多少商品还有存货,有多少商品已经售出 我正在尝试这样的查询: select * fr

我有三张桌子:

产品sku、价格、报价等 库存sku、分支机构、项目 销售供应商sku、项目、日期 表products包含有关产品的所有信息,库存或销售除外。当前库存存储在stock表中,并包含关于每个分支上有多少项可用的信息。表sales\u provider存储每个产品每天售出的商品数量。产品ID为sku

现在,我试图通过一个查询得到以下产品:

已产生销售的最佳利润数*报价 还有现货 当然,我想知道有多少商品还有存货,有多少商品已经售出

我正在尝试这样的查询:

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%:-