0

我有 3 张桌子:

  1. 产品(sku、价格、priceOffer 等)
  2. 库存(sku、分支、项目)
  3. sales_provider(sku、项目、日期)

表 products 包含有关产品的所有信息,除了库存或销售。当前库存存储在表 stock 中,并包含有关每个分支上可用的项目数量的信息。表“sales_provider”存储了每种产品每天售出的商品数量。产品 ID 为“sku”。

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

  1. 已产生最佳利润(销售数量 * 报价)
  2. 仍有现货

而且,当然,我想知道有多少物品仍在库存中,有多少物品已售出。

我正在尝试这样的查询:

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;

但我有问题。基本上,我得到了大量的库存物品和 sales_provider 物品,而不是实际数量。此外,这是一个缓慢的查询(仅 9,500 个产品大约需要半秒)。

我一直在尝试修改它,我怀疑子查询是否必要,但我无法确定它。

如果有人可以帮助我改进它并获得正确的结果,我将非常感激。

提前感谢您提供任何有用的评论。

弗朗西斯科

4

1 回答 1

2

对于这种类型的查询,您希望分别对stock和进行聚合sales_provider。否则,您将在给定项目的两个表之间生成笛卡尔积。

尝试这个:

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

这假设它product(sku)是唯一的。

于 2013-04-19T17:48:02.457 回答