我有3张桌子:
表格产品包含有关产品的所有信息,但库存或销售除外。当前库存存储在表库存中,并且包含有关每个分支上可用项目数的信息。表“sales_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;
但我遇到了问题。基本上,我得到了大量的库存物品和sales_provider物品,而不是真正的金额。此外,这是一个缓慢的查询(只需要9,500种产品需要大约半秒钟)。
我一直在努力修改它,我对子查询是必要的有疑问,但我无法指出它。
如果有人可以帮助我改进并获得正确的结果,我会非常感激。
提前感谢任何有用的评论。
旧金山
答案 0 :(得分: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)
是唯一的。