在MySQL上加入3个表来总结产品的销售和库存

时间:2013-04-19 17:35:11

标签: mysql sql join

我有3张桌子:

  1. 产品(sku,价格,priceOffer等)
  2. stock(sku,branch,items)
  3. sales_provider(sku,items,date)
  4. 表格产品包含有关产品的所有信息,但库存或销售除外。当前库存存储在表库存中,并且包含有关每个分支上可用项目数的信息。表“sales_provider”存储每个产品每天销售的商品数量。产品ID为“sku”。

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

    1. 已产生最佳利润(销售数量*提供价格)
    2. 现货供应
    3. 当然,我想知道有多少商品仍在库存,有多少商品已售出。

      我正在尝试这样的查询:

      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种产品需要大约半秒钟)。

      我一直在努力修改它,我对子查询是必要的有疑问,但我无法指出它。

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

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

      旧金山

1 个答案:

答案 0 :(得分:2)

对于此类查询,您希望在stocksales_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)是唯一的。