首页 > 解决方案 > 通过基于产品 ID 的销售价格获得最后一次购买价格的利润,销售日期

问题描述

我正在尝试优化我当前的查询,该查询根据上次购买的净额计算利润,具体取决于产品的销售日期和销售表中的数量。目前,它消耗了太多的内存和时间。

Spacking 是物品的销售单位。例如,如果 x 产品的 spacking 是 10,这意味着它可以分 10 件出售,或者假设一个盒子包含 10 件商品,但我们将其计算为 1 盒,但我们也将其出售,因此 spacking 将是 10对于那个项目。那么每单位该项目的净数量将是 net_amount/spacking。

在嵌套查询中,我通过((该产品 id 的总数量/数量))/spacking 计算一个单位的价格,并将其乘以当前销售数量,然后从总销售价格中减去它会给我该产品的利润。

产品

pcode (varchar(10)) 产品名称 (varchar(50)) 间距(int) 价格(双)
1343 巧克力盒 10 20 美元
1344 Panadol 地带 1 10 美元
1345 神经元注射液 5 2美元

购买

Product_code(FKey - 产品的 pcode) 日期(日期) Full_item (int) 件数(整数) 奖金(整数) 折扣(双) 净额/总金额(双倍)
1343 23-03-2021 10 0 2 2% 130 美元
1343 22-03-2021 10 0 1 2% 130 美元
1344 22-03-2021 5 0 5% 15 美元
1344 1-03-2021 5 0 5% 10 美元
1343 22-03-2021 10 0 1 2% 130 美元
1343 21-03-2021 10 0 0 2% 130 美元

销售

Product_code(FKey - 产品的 pcode) 日期(日期) Full_item (int) 件数(整数) 奖金(整数) 折扣(双) 净额/总金额(双倍)
1343 23-03-2021 2 0 0 0% 40 美元
1344 22-03-2021 1 0 0 0% 10 美元
1343 21-03-2021 1 0 0 0% 20 美元
1343 22-03-2021 0 9 0 0% 18 美元
1343 21-03-2021 1 0 0 0% 20 美元

在销售中,我为购买的每件商品添加了所有销售交易,每天它可能有不同的购买价格,为了获得利润,我们必须从一件商品的最新购买价格中减去销售价格。因此,日期在这里也起到了提取确切利润的作用,因为一件商品的销售可能来自不同的日期。

因此,我在下面编写了一个查询,它获取所有销售记录以及每个产品的利润。

一天,461 行,查询耗时 4.2298 秒。对于多天的记录,需要很长时间才能处理。

select
   product.product_name,
   product.pcode,
   product.spacking,
   (
   select
      round(sale.net_amount - ( (round((p.net_amount / (p.full_item + p.bonus_full)), 2) / product.spacking)* ((sale.full_item + sale.bonus_full)* product.spacking ) + (round((p.net_amount / (p.full_item + p.bonus_full)), 2) / product.spacking)* (sale.pieces)), 2
   ) 
   from
      purchase p 
   where
      p.invoice_date <= sale.invoice_date 
      and sale.product_code = p.product_code 
   order by
      p.invoice_date desc LIMIT 1)) as pnet_amount,
      DATE_FORMAT(sale.invoice_date, '%M %d %Y') as date,
      sale.invoice_number,
      sale.full_item,
      sale.pieces,
      sale.bonus_full_item,
      sale.price,
      sale.discount,
      sale.net_amount 
   from
      sale 
      join
         product 
         on product.pcode = sale.product_code 
      join
         customer 
         on customer.ccode = sale.customer_code 
   where
      sale.invoice_date BETWEEN '2021-03-14' and '2021-03-16' 
   order by
      sale.invoice_date desc

标签: mysqlgroupwise-maximum

解决方案


推荐阅读